VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 コマンドボタン関係のメニュー
1.Command ボタンに関するワンポイントテクニック集
2.Command1.Caption 等に左揃え・右揃えで文字を表示
3.Win32 API を使っての Command ボタンの Caption の Alignment を設定
4.コマンドボタンの装飾(ForeColor / フォント色の設定他)
5. コマンドボタンでダブルクリックイベントを取得する
6.コマンドボタン上でのリピート操作を実装する
7.キーボードフックによるコマンドボタン上での検出できないキーの監視
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.その他、当サイト内に掲載しているコマンドボタンに関するサンプル


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キーが押された事を取得
コマンドボタン上での矢印キーによる移動をさせない。 どのキーが押されたかを取得 キーダウンイベント 

このページのトップへ移動します。