вот что я сделал до сих пор, пытаясь научиться работать с хуками, кнопками и сообщениями на окнах:
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 — это буфер BYTE с пространством 256).
Спасибо за любую помощь или идею.
if((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
{
wchar_t c;
switch (wParam)
{
case WM_CHAR:
c = (wchar_t)wParam;
break;
default:
break;
}
}
if
условие будет оцениваться только когда wParam == WM_KEYDOWN
, В этот момент нет абсолютно никакой возможности для wParam
быть одновременно WM_CHAR
, Таким образом, вы никогда не сможете присвоить значение c
,
документация объясняет, что для WH_KEYBOARD_LL
крючки, возможные значения для wParam
являются WM_KEYDOWN
, WM_KEYUP
, WM_SYSKEYDOWN
, или же WM_SYSKEYUP
, Другими словами, вы не получите WM_CHAR
Сообщения. Вам нужно будет самостоятельно переводить нажатия клавиш. Эти вопросы охватывают эту тему:
Таким образом, это достаточно просто для простых раскладок клавиатуры, но очень сложно, как только IME участвует.