7.キーボードフックによるコマンドボタン上での検出できないキー(矢印キーやEnterキー等)の監視 |
1.キーボードフックによるコマンドボタン上での検出できないキー(矢印キーやEnterキー等)の監視 2. 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6) Option :[Option Explicit] 参照設定: 使用 API:CallNextHookEx / UnhookWindowsHookEx / SetWindowsHookEx その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。 :サブクラス化しておりますので、サブクラス化について知識のない方は使用しないようにして下さい。
|
1.キーボードフックによるコマンドボタン上での検出できないキー(矢印キーやEnterキー等)の監視 |
下記の部分は、標準モジュール(Module1)に記入願います。 Option Explicit Public Declare Function CallNextHookEx Lib "user32" ( _ ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function UnhookWindowsHookEx Lib "user32" ( _ ByVal hHook As Long) As Long Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( _ ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long 'Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _ ' ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 'Public Declare Function GetActiveWindow Lib "user32" () As Long 'Public Declare Function SetFocus Lib "user32" (ByVal hWnd As Long) As Long Public Const WH_KEYBOARD = 2 Public hHook As Long Public MehWnd As Long 'サブクラス化しているフォームのハンドル ' Filter function to process keyboard events before the property page handles them: Public Function KeyboardFilterFunction(ByVal nCode As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long ' Variable to store the result of calls to external procedures: Dim Ret As Long ' Verify that the hook code is valid: If nCode >= 0 Then Form1.SetKeyCode wParam If Screen.ActiveControl.Name = "Command1" Then If wParam = vbKeyUp Or _ wParam = vbKeyDown Or _ wParam = vbKeyLeft Or _ wParam = vbKeyRight Or _ wParam = vbKeyReturn Then KeyboardFilterFunction = 1 Exit Function End If End If End If ' Call the next function in the filter function chain: KeyboardFilterFunction = CallNextHookEx(hHook, nCode, wParam, lParam) End Function 下記のコードは、Form1 に記入願います。 Option Explicit Public Sub SetKeyCode(ByVal keycode As Long) Label2.Caption = keycode End Sub Private Sub Command1_Click() MsgBox "Command1 がクリックされました" End Sub Private Sub Command2_Click() MsgBox "Command2 がクリックされました" End Sub Private Sub Form_Load() MehWnd = Me.hWnd 'このフォームのハンドル 'サブクラス化の開始(キーボードの監視) hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardFilterFunction, 0, App.ThreadID) End Sub Private Sub Form_Unload(Cancel As Integer) 'サブクラス化の解除(キーボードの監視終了) Call UnhookWindowsHookEx(hHook) End Sub 過去の掲示板を見ていても同様の質問が結構あったのと、MicroSoft のサイトに下記のコードが掲載されていたので、応用して試して見ました。 プロパティページがちらつくし、アプリケーションが Microsoft 管理コンソールで、ESC キーを押すと応答を停止 尚、サブクラス化しておりますので、ご自分の責任の元でご利用願います。 |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
キーボードフックによるコマンドボタン上での検出できないキー(矢印キーやEnterキー等)の監視 Command1_KeyDown イベントで取得できないキーの検出 コマンドボタン上での矢印キーが押された事を取得 コマンドボタン上でのEnterキーが押された事を取得 コマンドボタン上での矢印キーによる移動をさせない。 どのキーが押されたかを取得 キーダウンイベント |