Проблемы с крючками и ключами

вот что я сделал до сих пор, пытаясь научиться работать с хуками, кнопками и сообщениями на окнах:

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).

Спасибо за любую помощь или идею.

-1

Решение

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 участвует.

2

Другие решения


По вопросам рекламы [email protected]