带有WH_KEYBOARD的SetWindowsHookEx卡在循环/队列中

时间:2014-10-04 18:51:35

标签: c++ dll hook dll-injection setwindowshookex

我正在尝试使用dll-injection挂钩记事本。在运行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;
}

DLL

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

1 个答案:

答案 0 :(得分:1)

在SetWindowsHookEx和UnhookWindowsHookEx之间添加消息循环修复它

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