いつも勉強させて頂いてます。
タイトルにもあるようにコントロールボタンの左右別にキーイベントを取得したいのですが、何か方法はありますでしょうか?
※サブクラス化以外でお願いします。
コントロールボタン押下時ってマウスでクリックした時じゃないんですか?
そうだったら、キーイベントは取得できないと思うんですが。
また、左右別にって左右に並んだ2つのコマンドボタンってことですか?
それなら、それぞれのボタンのKeyDownやKeyPressにコードを書けば
いいのでは?
なんか、おもいっきり外している気がする・・・。
WinAPIのGetKeyState()とかですかねぇ…
NTなら出来ると書いてあります。
ただし、この方法ではイベントとしてではなく、ポーリングして検出しなければなりませんが。
>コントロールボタン押下時ってマウスでクリックした時じゃないんですか?
>だったら、キーイベントは取得できないと思うんですが。
>また、左右別にって左右に並んだ2つのコマンドボタンってことですか?
>それなら、それぞれのボタンのKeyDownやKeyPressにコードを書けば
>いいのでは?
すいません。書き方が悪かったようで。
キーボードの左右Ctrlボタン押下の話です。
>ただし、この方法ではイベントとしてではなく、ポーリングして検出しなければなりませんが。
・・・しかなさそうですね。
サブクラスでがんばってみます。
ありがとうございました。
あー、でも、こんな具合のなら、なんとか出来るみたい。
…全然ダメダメかも。
'Form1
Option Explicit
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Const VK_LCONTROL = &HA2
Private Const VK_RCONTROL = &HA3
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift And vbCtrlMask Then
If GetKeyState(VK_LCONTROL) And 128 Then
Debug.Print "L"
ElseIf GetKeyState(VK_RCONTROL) And 128 Then
Debug.Print "R"
End If
End If
End Sub
質問者の環境が、現行バージョン(VB.NET 2003)と仮定して。
Private Declare Function GetKeyboardState Lib "user32" ( _
ByVal KeyState() As Byte _
) As <MarshalAs(UnmanagedType.Bool)> Boolean
Private Sub Form1_KeyUpDown(ByVal sender As Object, _
ByVal e As KeyEventArgs) Handles MyBase.KeyDown, MyBase.KeyUp
Label1.Text = ""
Label2.Text = ""
If e.Control Then
Dim KeyState(255) As Byte
GetKeyboardState(KeyState)
If CBool(KeyState(Keys.LControlKey) And &H80) Then
Label1.Text = "左Ctrl"
End If
If CBool(KeyState(Keys.RControlKey) And &H80) Then
Label2.Text = "右Ctrl"
End If
End If
End Sub
ツイート | ![]() |