【问题标题】:SetWindowsHookEx succeed but callback function is never calledSetWindowsHookEx 成功但从未调用回调函数
【发布时间】:2015-10-10 06:38:34
【问题描述】:

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

我编写了另一个程序来加载这个 dll 并调用 installHook。显示“安装成功”消息框但从未调用回调函数,在E盘下找不到enter.txt。

我使用的是 Win7 + VS2013。

【问题讨论】:

  • 可能值得仔细检查回调函数是否真的没有被调用,例如,通过更改它以使进程崩溃。 (以防万一它实际上是写入文件的问题,或者 C++ 运行时出现故障,或类似情况。)
  • @HarryJohnston 嗨,我尝试在回调函数中显示一个消息框,但在运行时没有出现消息框
  • 你在一个线程上设置了一个钩子。它是正确的线程吗?
  • @Ben 你是对的,我将 SetWindowsHookEx 的参数更改为 WH_CBT、CBTNewProc、hInstance、GetCurrentThreadId(),问题就解决了。谢谢~
  • 注意GetModuleHandle(NULL)返回调用进程的模块句柄,而不是DLL。您需要改用 DLL 的模块句柄。您的 DLL 从其 DllMain()/DllEntryPoint() 函数中获取。

标签: c++ winapi hook


【解决方案1】:

要在其他进程中设置挂钩,您必须将包含挂钩 proc 的 DLL 的 hInstance 传递给SetWindowsHookEx

您还应该传递零作为线程 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多