AkelPad.ThreadHook (+ActiveX)

Установить хук для потока.

ThreadHook(nId, lpFunction, nThreadId[, ...])

Параметры

nIdСм. первый параметр SetWindowsHookEx в MSDN.
lpFunctionФункция с 3 параметрами, куда будут приходить вызовы.
nThreadIdИдентификатор потока. Установка глобального хука не поддерживается.
...Фильтр сообщений. Будут приходить только указанные сообщения. Если не указан, будут приходить все сообщения.
nId должен быть одним из следующих значений: WH_CALLWNDPROC, WH_CALLWNDPROCRET, WH_GETMESSAGE, WH_MSGFILTER, WH_SYSMSGFILTER.

Возвращаемое значение


Число. Дескриптор хука.

Замечания
Максимальное число работающих хуков не должно превышать 30-ти.

Пример

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var dwMainThreadID = oSys.Call("user32::GetWindowThreadProcessId", hMainWnd, 0);
var hHook;

if (hHook = AkelPad.ThreadHook(3 /*WH_GETMESSAGE*/ , HookCallback, dwMainThreadID, 0x100 /*WM_KEYDOWN*/ )) {
    //Message loop
    AkelPad.WindowGetMessage();

    AkelPad.ThreadUnhook(hHook);
}

function HookCallback(nCode, wParam, lParam) {
    var uMsg = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 8 : 4) /*offsetof(MSG, message)*/ , 3 /*DT_DWORD*/ );

    if (uMsg == 0x100 /*WM_KEYDOWN*/ ) {
wParam = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8) /*offsetof(MSG, wParam)*/ , 2 /*DT_QWORD*/ );

        AkelPad.MessageBox(0, "Key \"" + String.fromCharCode(wParam) + "\" with code \"" + wParam + "\" is pressed.", "", 0);

        //Exit message loop
        oSys.Call("user32::PostQuitMessage", 0);
    }
}