SetWindowsHookEx()只注册一个本地钩子,同时注入DLL

时间:2013-06-23 14:09:37

标签: c# c++ winapi interop

我在非托管C ++ DLL中有以下代码。 ToasterHook()函数由C#app使用P / Invoke调用,并且重写WndProc以捕获任何WM_COPYDATA消息。 Process Explorer说我的DLL已经注入到其他进程中,但是我只在表单加载时收到WM_COPYDATA。

#pragma data_seg (".SHARED")
HHOOK g_HookHandle = 0;
HINSTANCE DllHandle; 
HOOKPROC hkprcSysMsg;
#pragma data_seg()


extern "C" __declspec(dllexport) int ToasterHook()
{
    if(g_HookHandle != 0) return 0;
    DllHandle = LoadLibrary(L"toasterHookDll.dll");
    hkprcSysMsg = (HOOKPROC)GetProcAddress(DllHandle, "_ToasterInterProcFilter@12");
    g_HookHandle = SetWindowsHookEx(WH_SHELL, hkprcSysMsg, DllHandle, 0);
    return 0;
}

extern "C" __declspec(dllexport)
LRESULT CALLBACK ToasterInterProcFilter(int code, WPARAM wParam, LPARAM lParam)
{
    if(code == HSHELL_WINDOWCREATED) {
        HWND g_ToasterReceiver = FindWindow(NULL, L"toaster");
        SendNotifyMessage(g_ToasterReceiver, WM_COPYDATA, wParam, lParam);
    }
    return CallNextHookEx(g_HookHandle, code, wParam, lParam);
}

extern "C" __declspec(dllexport) void ToasterUnHook()
{
    if(g_HookHandle == 0) return;
    UnhookWindowsHookEx(g_HookHandle);
}

我在这里做错了什么?为HOOKPROC指定GetProcAddress(DllHandle, "_ToasterInterProcFilter@12")ToasterInterProcFilter本身的结果似乎正在起作用。

1 个答案:

答案 0 :(得分:1)

发送WM_COPYDATA消息时,lParam必须指向COPYDATASTRUCT结构。该数据结构包含诸如指向要复制的数据的指针和数据大小的信息。 Windows会自动处理这些数据的编组,以便接收消息的应用程序可以访问它。

您的代码目前正在通过lParam附带的HSHELL_WINDOWCREATED。 Windows可能会将其指向的数据解释为COPYDATASTRUCT结构,但在大多数情况下,它会失败。