C++ SetWindowsHookEx成功,但从未调用回调函数

C++ SetWindowsHookEx成功,但从未调用回调函数,c++,winapi,hook,C++,Winapi,Hook,dll代码: LRESULT CALLBACK CBTNewProc(int nCode, WPARAM wParam, LPARAM lParam) { std::ofstream file; file.open("E:\\enter.txt", std::ios::out); file << nCode; file.close(); return CallNextHookEx(g_hHook, nCode, wParam, lParam

dll代码:

LRESULT CALLBACK CBTNewProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    std::ofstream file;
    file.open("E:\\enter.txt", std::ios::out);
    file << nCode;
    file.close();

    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}


extern "C" __declspec(dllexport) void installHook()
{
    if (g_hHook != NULL){
        UnhookWindowsHookEx(g_hHook);
        g_hHook = NULL;
    }
    HINSTANCE hInstance = GetModuleHandle(NULL);
    g_hHook = SetWindowsHookEx(WH_CBT, CBTNewProc, NULL, GetCurrentThreadId());
    if (g_hHook == NULL)
    {
        MessageBox(NULL, L"fail!", L"caption", MB_OK);
    }
    else
    {
        MessageBox(NULL, L"install success!", L"caption", MB_OK);
    }
}
LRESULT回调CBTNewProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
流文件的std::of;
打开(“E:\\enter.txt”,std::ios::out);

文件要在其他进程中设置钩子,必须将包含钩子过程的DLL的hInstance传递给
SetWindowsHookEx


您也应该通过线程ID。0 /P>可能值得重复检查回调函数是否真的没有被调用,例如,通过改变它来崩溃进程(以防万一,它实际上是写入文件的问题,或者C++运行时出现故障,或诸如此类的事情)。@HarryJohnston您好,我尝试在回调函数中显示消息框,但在运行时没有显示消息框您正在单个线程上设置一个钩子。它是正确的线程吗?@Ben您是对的,我将setWindowshookx的参数更改为WH_CBT,CBTNewProc,hInstance,GetCurrentThreadId()Thx~请注意,

GetModuleHandle(NULL)
返回调用进程的模块句柄,而不是DLL。您需要使用DLL的模块句柄。您的DLL从其
DllMain()
/
DllEntryPoint()
函数获取该句柄。