特殊キーの状態を取得・タブキーの押下を取得する |
特殊キーの現在の状態を取得する・タブキーの押下を取得する (002) | |
Option Explicit 'SampleNo=002 WindowsXP VB6.0(SP5) 2002.04.16 '仮想キーの押下状態を取得する(P1064) Private Declare Function GetKeyState Lib "user32" _ (ByVal nVirtKey As Long) As Integer 'キーストロークをシミュレートする(P1065) Private Declare Sub keybd_event Lib "user32.dll" _ (ByVal bVk As Byte, ByVal bScan As Byte, _ ByVal dwFlags As Long, ByVal dwExtraInfo As Long) '仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067) Private Declare Function MapVirtualKey Lib "user32" _ Alias "MapVirtualKeyA" (ByVal wCode As Long, _ ByVal wMapType As Long) As Long Private Const VK_CAPITAL = &H14 Private Const VK_INSERT = &H2D Private Const VK_SHIFT = &H10 Private Const VK_NUMLOCK = &H90 Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Sub Command2_Click() '各特殊キーの現在の状態を取得(下位ビットを取得 1=ON 0=OFF) If GetKeyState(vbKeyCapital) And &H1 Then Label3.Caption = "CapsLook キーはオンの状態です。" Else Label3.Caption = "CapsLook キーはオフの状態です。" End If If GetKeyState(vbKeyNumlock) And &H1 Then Label4.Caption = "Numlock キーはオンの状態です。" Else Label4.Caption = "Numlock キーはオフの状態です。" End If If GetKeyState(vbKeyInsert) And &H1 Then Label5.Caption = "Insert キーはオンの状態です。" Else Label5.Caption = "Insert キーはオフの状態です。" End If End Sub Private Sub Text1_LostFocus() 'タブキーが押されたか?調査 If GetKeyState(vbKeyTab) < 0 Then Label2.Caption = "タブキーが押されました。" Else Label2.Caption = "" End If End Sub Private Sub Timer1_Timer() '符号付き変数の最上位ビットは符号情報が入っているのでこれで判断できます If GetKeyState(vbKeyTab) < 0 And _ GetKeyState(VK_SHIFT) < 0 Then Label1.Caption = "Shift キーとタブキーが押されました。" ElseIf GetKeyState(vbKeyTab) < 0 Then Label1.Caption = "タブキーが押されました。" Else Label1.Caption = "" End If End Sub Private Sub Command3_Click() 'CapsLock キーをクリック Call keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), _ KEYEVENTF_EXTENDEDKEY Or 0, 0) Call keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), _ KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) End Sub Private Sub Command4_Click() 'Insert キーをクリック Call keybd_event(VK_INSERT, MapVirtualKey(VK_INSERT, 0), _ KEYEVENTF_EXTENDEDKEY Or 0, 0) Call keybd_event(VK_INSERT, MapVirtualKey(VK_INSERT, 0), _ KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) End Sub Private Sub Command5_Click() 'NumLock キーをクリック Call keybd_event(VK_NUMLOCK, MapVirtualKey(VK_NUMLOCK, 0), _ KEYEVENTF_EXTENDEDKEY Or 0, 0) Call keybd_event(VK_NUMLOCK, MapVirtualKey(VK_NUMLOCK, 0), _ KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) End Sub 結果 |
|
通常、KeyDown イベントおよび KeyUp イベントではTab キーのイベントは発生(取得できない)し ません。 Tab キーが押されたかを取得するには、すべてのコントロールのTabStopをFalseに設定するか GetKeyState API関数を使用してタイマーイベントで監視するかLostFocusイベントで関数を呼び 出せば実現できます。 又、VBのKeyDown イベントでは発生しないNumLockキー等のトグル状態も取得できます。 MapVirtualKey APIでスキャンコードを得ることでWindows2000以降のShift キー等の動作不良にも 対応。Win2000以前ならkeybd_eventAPI単独使用でも問題なく動作するようです。 |
2002/04/16