这是我到目前为止所做的尝试学习处理窗口上的钩子,按钮和消息:
in main.cpp
//Create a thread for keyboard:
HANDLE hScreenThread2;
DWORD idScreenThread2;
hScreenThread2 = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) KeyLogger, 0, 0, &idScreenThread2);
if(hScreenThread2) {
WaitForSingleObject(hScreenThread2, INFINITE);
TerminateThread(hScreenThread2, 0);
CloseHandle(hScreenThread2);
}
in keylogger.cpp
DLLEXPORT DWORD WINAPI KeyLogger ( LPVOID lpParamenter )
{
//armazena a mensagem do windows
HINSTANCE hExe = GetModuleHandle(NULL); //?
//cria o hook
hHook1 = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC) KeyBoardHook, hExe, 0);
//loop de mensagens
MessageLoop();
//destrói o hook
UnhookWindowsHookEx(hHook1);
return 0;
}
The message loop
VOID MessageLoop()
{
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
and finally the source of my headache:
LRESULT CALLBACK KeyBoardHook( int nCode, WPARAM wParam, LPARAM lParam )
{
if((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
{
wchar_t c;
switch (wParam)
{
case WM_CHAR:
c = (wchar_t)wParam;
break;
default:
break;
}
}
return CallNextHookEx(hHook1,nCode,wParam,lParam);
}
简而言之:我无法捕捉击键,更不用说必须组合在键盘上形成重音字母的键,例如我必须按下锐音(')掉落并按下字母(e)以获得字母“ é” . 我的键盘是ABNT2巴西葡萄牙语 . 任何想法从哪里开始,因为我尝试过使用GetAsyncKeyState(),但如前所述,我有一个字母“é”我必须首先按下键('),释放它,然后按下另一个键,我不知道如何使捕获两个事件分开 . 我已经尝试了GetKeyState(0)和GetKeyboardState(kb)(kb是一个空间为256的BYTE缓冲区) .
感谢您的任何帮助或意见 .
1 回答
if
条件仅在wParam == WM_KEYDOWN
时评估为真 . 在这一点上,wParam
绝对不可能同时WM_CHAR
. 所以你永远不能为c
赋值 .documentation解释了对于
WH_KEYBOARD_LL
钩子,wParam
的可能值是WM_KEYDOWN
,WM_KEYUP
,WM_SYSKEYDOWN
或WM_SYSKEYUP
. 换句话说,您将不会收到任何WM_CHAR
消息 . 您需要自己翻译击键 . 这些问题涉及该主题:How to convert a message from a WH_KEYBOARD_LL to corespondig unicode char
Correct logic for interpreting SetWindowsHookEx / WH_KEYBOARD_LL
总之,简单的键盘布局很容易,但只要涉及到IME就非常棘手 .