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);
}
}