Function Reference

_WinAPI_SetWindowsHookEx

フックチェーンにアプリケーション定義のフックプロシージャを設定します。

#Include <WinAPI.au3>
_WinAPI_SetWindowsHookEx($idHook, $lpfn, $hmod [, $dwThreadId = 0])

 

パラメータ

$idHook 設定されるフックプロシージャの種類を指定します。このパラメータは次の値のいずれかです:
$WH_CALLWNDPROC - システムが目的のウィンドウプロシージャへ送信する前のメッセージを監視するフックプロシージャを設定します。
$WH_CALLWNDPROCRET - 目的のウィンドウプロシージャが処理した後のメッセージを監視するフックプロシージャを設定します。
$WH_CBT - コンピュータを利用したトレーニング(CBT)アプリケーションに有用な通知を受け取るフックプロシージャを設定します。
$WH_DEBUG - ほかのフックプロシージャのデバッグに有用なフックプロシージャを設定します。
$WH_FOREGROUNDIDLE - アプリケーションのフォアグラウンドスレッドがアイドル状態になろうとしているときに呼び出されるフックプロシージャを設定します。
$WH_GETMESSAGE - メッセージキューへポストされたメッセージを監視するフックプロシージャを設定します。
$WH_JOURNALPLAYBACK - WH_JOURNALRECORDフックプロシージャが既に記録したメッセージをポストするフックプロシージャを設定します。
$WH_JOURNALRECORD - システムメッセージキューへポストされた入力メッセージを記録するフックプロシージャを設定します。
$WH_KEYBOARD - キーストロークメッセージを監視するフックプロシージャを設定します。
$WH_KEYBOARD_LL - Windows NT/2000/XP: 低水準のキーボード入力イベントを監視するフックプロシージャを設定します。
$WH_MOUSE - マウスメッセージを監視するフックプロシージャを設定します。
$WH_MOUSE_LL - Windows NT/2000/XP: 低水準のマウス入力イベントを監視するフックプロシージャを設定します。
$WH_MSGFILTER - ダイアログボックス、メッセージボックス、メニュー、スクロールバーのいずれかへの入力イベントの結果として生成されたメッセージを監視するフックプロシージャを設定します。
$WH_SHELL - シェルアプリケーションにとって有用な通知を受け取るフックプロシージャを設定します。
$WH_SYSMSGFILTER - ダイアログボックス、メッセージボックス、メニュー、スクロールバーのいずれかへの入力イベントの結果として生成されたメッセージを監視するフックプロシージャを設定します。
$lpfn フックプロシージャへのポインタ。
$dwThreadIdパラメータがゼロまたは異なるプロセスに作成されたスレッドの識別子を指定する場合、
$lpfnパラメータはDLL内のフックプロシージャを指さなければなりません。
それ以外の場合、$lpfnは 現在のプロセスに関連付けられたコードのフックプロシージャを指すことができます。
$hmod $lpfnパラメータによって指されるフックプロシージャを格納しているDLLのハンドル。
$dwThreadIdパラメータが現在のプロセスによって作成されたスレッドを指定している場合、
またフックプロシージャが現在のプロセスに関連付けられたコード内にある場合、
$hModパラメータはNULLに設定されていなければなりません。
$dwThreadId [オプション] フックプロシージャが関連付けられているスレッドの識別子を指定します。
このパラメータがゼロの場合、フックプロシージャは同じデスクトップで呼び出し元スレッドとして実行している既存の全てのスレッドと関連付けられます。

 

返し値

成功: フックプロシージャのハンドル
失敗: 0を返し、@errorを設定します

 

注意

なし。

 

関連

_WinAPI_UnhookWindowsHookEx, _WinAPI_CallNextHookEx, DllCallbackRegister, DllCallbackGetPtr, DllCallbackFree

 

こちらも参照

MSDNライブラリでSetWindowsHookExを検索して下さい。

 


#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Opt('MustDeclareVars', 1)

Global $hHook, $hStub_KeyProc, $buffer = ""

_Main()

Func _Main()
    OnAutoItExitRegister("Cleanup")

    Local $hmod

    $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    $hmod = _WinAPI_GetModuleHandle(0)
    $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

    MsgBox(4096, "", "Click OK, then in notepad type..." & _
            @CRLF & @CRLF & "Jon" & @CRLF & "AutoIt" & @CRLF & @CRLF & "Press Esc to exit script")

    Run("Notepad")
    WinWait("Untitled -")
    WinActivate("Untitled -")

    While 1
        Sleep(10)
    WEnd
EndFunc   ;==>_Main

Func EvaluateKey($keycode)
    If (($keycode > 64) And ($keycode < 91)) _ ; a - z
            Or (($keycode > 96) And ($keycode < 123)) _ ; A - Z
            Or (($keycode > 47) And ($keycode < 58)) Then ; 0 - 9
        $buffer &= Chr($keycode)
        Switch $buffer
            Case "Jon"
                ToolTip("What can you say?")
            Case "AutoIt"
                ToolTip("AutoIt Rocks")
        EndSwitch
    ElseIf ($keycode > 159) And ($keycode < 164) Then
        Return
    ElseIf ($keycode = 27) Then ; esc key
        Exit
    Else
        $buffer = ""
    EndIf
EndFunc   ;==>EvaluateKey

;===========================================================
; コールバック関数
;===========================================================
Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    If $wParam = $WM_KEYDOWN Then
        EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"))
    Else
        Local $flags = DllStructGetData($tKEYHOOKS, "flags")
        Switch $flags
            Case $LLKHF_ALTDOWN
                ConsoleWrite("$LLKHF_ALTDOWN" & @CRLF)
            Case $LLKHF_EXTENDED
                ConsoleWrite("$LLKHF_EXTENDED" & @CRLF)
            Case $LLKHF_INJECTED
                ConsoleWrite("$LLKHF_INJECTED" & @CRLF)
            Case $LLKHF_UP
                ConsoleWrite("$LLKHF_UP: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "vkCode - " & DllStructGetData($tKEYHOOKS, "vkCode") & @CRLF)
        EndSwitch
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc

Func Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_KeyProc)
EndFunc   ;==>Cleanup