2.特殊キーの状態を取得及び設定する |
1.タブキーが押されたどうかを取得する 2.特殊キーの状態を取得及び設定 (1) CapsLock キーの状態を取得及び設定する (2) Insert キーの状態を取得及び設定する (3) NumLock キーの状態を取得及び設定する 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6) Option :[Option Explicit] 参照設定: 使用 API:keybd_event / MapVirtualKey / GetKeyState その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。 :
|
1.タブキーが押されたどうかを取得する |
共通部分 Option Explicit 'SampleNo:002 2002.04.16 @ 2006.12.28 '仮想キーの押下状態を取得する(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 Text1_LostFocus() 'タブキーが押されたか?調査 If GetKeyState(vbKeyTab) < 0 Then Label2.Caption = "タブキーが押されました。" Else Label2.Caption = "" End If End Sub Shift キーとタブキーが押されたかどうかを取得 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 通常、KeyDown イベントおよび KeyUp イベントでは、Tab キーのイベントは発生(取得できない)しません。 Tab キーが押されたかを取得するには、すべてのコントロールの TabStop を False に設定するか、GetKeyState API 関数を使用してタイマーイベントで監視するか、LostFocus イベントで関数を呼び出せば実現できます。 |
2.特殊キーの状態を取得及び設定 |
(1) CapsLock キーの状態を取得及び設定する (2) Insert キーの状態を取得及び設定する (3) NumLock キーの状態を取得及び設定する 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 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 タブキー同様、VBのKeyDown イベントでは発生しないNumLockキー等のトグル状態もこのようにすれば取得できます。 MapVirtualKey APIでスキャンコードを得ることでWindows2000以降のShift キー等の動作不良にも対応。Win2000以前ならkeybd_eventAPI単独使用でも問題なく動作するようです。 |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
KeyDown イベント KeyPress イベント Tab キー タブキー シフトキー キャプスロックキーの状態を取得及び設定する インサートキーの状態を取得及び設定する ニューメリックロックキーの状態を取得及び設定する 特殊キーのON OFF状態を取得 特殊キーのON OFF状態を設定 |