gpt4 book ai didi

c# - SetWindowsHookEx() 只注册一个本地钩子(Hook),而 DLL 被注入(inject)

转载 作者:行者123 更新时间:2023-11-28 07:33:11 29 4
gpt4 key购买 nike

我在非托管 C++ DLL 中有以下代码。 ToasterHook() 函数由 C# 应用程序使用 P/Invoke 调用,并且 WndProc 被覆盖以捕获任何 WM_COPYDATA 消息。 Process Explorer 说我的 DLL 已被注入(inject)到其他进程中,但我只在加载表单时收到一次 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 本身似乎都有效。

最佳答案

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

您的代码当前正在传递伴随 HSHELL_WINDOWCREATEDlParam。 Windows 可能会将它指向的数据解释为 COPYDATASTRUCT 结构,但在大多数情况下它会失败。

关于c# - SetWindowsHookEx() 只注册一个本地钩子(Hook),而 DLL 被注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17261542/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com