SetWindowsHookEx с WH_KEYBOARD застрял в цикле / очереди

Я пытаюсь подключить Блокнот с DLL-инъекцией. После запуска exe-файла и перехвата Блокнота (из того, что я могу сказать успешно) и нажатия некоторых клавиш, кажется счастливым то, что нажатия клавиш застряли в цикле или в очереди (Блокнот не отвечает). После открепления exe Блокнот отвечает, и все нажатые клавиши появляются в текстовом поле.

EXE

#include <iostream>
#include <fstream>
#include <windows.h>
#include <stdio.h>

HHOOK       hHook     = NULL;
HWND        handle    = NULL;
HMODULE     dll       = NULL;
HOOKPROC    address   = NULL;
DWORD       thread_id = 0;

using namespace std;

int main(){

handle=FindWindow(NULL,L"Untitled - Notepad");
if(handle==NULL){
cout<<"Window not found"<<endl;
getchar();
return 0;
}

thread_id=GetWindowThreadProcessId(handle,NULL);
if(thread_id==0){
cout<<"ID not found"<<endl;
getchar();
return 0;
}

dll = LoadLibrary(TEXT("X:\\qt\\hook\\debug\\hook.dll"));
if(dll==NULL){
cout<<"hook.dll not found"<<endl;
getchar();
return 0;
}

address=(HOOKPROC)GetProcAddress(dll,"CallWndProc@12");
if(address==NULL){
cout<<"Address not found"<<endl;
getchar();
return 0;
}

hHook=SetWindowsHookEx(WH_KEYBOARD,address,dll,thread_id);
if(hHook==NULL){
cout<<"hook was not set"<<endl;
return 0;
}

cout<<"Program successfully hooked"<<endl;
cout<<"Press enter to unhook the function and stop the program"<<endl;
getchar();
UnhookWindowsHookEx(hHook);

return 0;
}

длл

#include "hook.h"#include <windows.h>
#include <iostream>
#include <fstream>

using namespace std;

extern "C"{
__declspec(dllexport) LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam){

if(nCode<0){
return CallNextHookEx(NULL,nCode,wParam,lParam);
}

ofstream file;
file.open("X:\\qt\\klog\\debug\\function.txt");
file<<"Function keyboard_hook called\n";
file.close();
return CallNextHookEx(NULL,nCode,wParam,lParam);
}
}

BOOL APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved){

switch(Reason) {
case DLL_PROCESS_ATTACH: break;
case DLL_PROCESS_DETACH: break;
case DLL_THREAD_ATTACH:  break;
case DLL_THREAD_DETACH:  break;
}

return TRUE;
}

2

Решение

Исправлено добавление цикла сообщений между SetWindowsHookEx и UnhookWindowsHookEx

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
1

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


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