【问题标题】:Why is wparam changing if i use same message, with same paras?如果我使用相同的消息和相同的参数,为什么 wparam 会发生变化?
【发布时间】:2011-02-18 01:28:43
【问题描述】:

我目前正在尝试将http://www.codeproject.com/KB/threads/winspy.aspx(子类化部分)中的一些代码实现到我的项目中,但是遇到了一些问题,我调试了 dll,似乎当我向被钩子发送完全相同的消息(或者我认为)时线程的 hwnd 消息似乎有所不同(由于直接通过 Visual Studio 调试 dll 文件,我看到了这一点)。

因此,从一开始,我就为所有 dll 实例共享我的自定义 winregistered mssg。在这里,我正在编写我用于两个项目的内容(从上面的站点下载的项目,以及我当前尝试模仿相同策略的项目)

我首先与所有 dll 实例分享我稍后将注册的消息(在 dll 进程中)..

#pragma data_seg("共享") UINT WM_HOOKEX = 0; #pragma data_seg()

好的,现在是时候在 dll 附加时注册它了...

BOOL APIENTRY DllMain( 处理 hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { 如果(ul_reason_for_call == DLL_PROCESS_ATTACH) { g_hInstDll = (HINSTANCE) hModule; ::DisableThreadLibraryCalls(g_hInstDll); 如果(WM_HOOKEX==NULL) WM_HOOKEX = ::RegisterWindowMessage(_T("WM_HOOKEX_RK")); } 返回真; }

最后,在我连接到线程后,我发送消息

hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookProc, g_hInstDll, GetWindowThreadProcessId(plist,NULL) ); SendMessage(hwnd,WM_HOOKEX,0,1);

现在感谢 VS dll 调试,我可以检查另一端是如何接收此消息的,在原始“注入代码的 3 种方式”项目子类化部分的情况下,参数是

wparam = 1 lparam = 23720848

在我的项目中

wparam = 0 lparam = 23720824

似乎在调试过程中根本无法识别 WM_HOOKEX,使用相同的参数!

我真的不明白,我用完全相同的名称注册 dll 进程附加的钩子,除了我使用 WM_HOOKEX = ::RegisterWindowMessage( _T("WM_HOOKEX_RK") );" 和 _T 因为我的项目是 unicode 但我真的怀疑这很重要。

其他一切都是 100% 相同

SendMessage(相同的hwnd,相同的mssg,0,1);

任何想法为什么我的项目中的另一方不会看到正确的 mssg 和正确的 paras?

谢谢

【问题讨论】:

  • 你没有发布回调函数,很难猜。
  • 另外,你不需要在你的 DLL 中修改共享部分。每次调用 RegisterWindowMessage(_T("WM_HOOKEX_RK")) 都会返回相同的值。
  • 这个问题在当前状态下毫无意义。您将 wParam=0 和 lParam=1 传递给 SendMessage,它根本不映射到您在钩子 proc 中获得的 wParam 和 lParam。你需要包含回调函数!
  • 请忽略这个问题,放弃它并用静态布尔检查解决它,谢谢帮助

标签: c++ c windows winapi


【解决方案1】:

第一个问题,你为什么要这样做:

hHook = SetWindowsHookEx( WH_CALLWNDPROC,(HOOKPROC)HookProc,
                            g_hInstDll, GetWindowThreadProcessId(plist,NULL);

改写成

hHook = SetWindowsHookEx( WH_CALLWNDPROC,HookProc,
                            g_hInstDll, GetWindowThreadProcessId(plist,NULL)); 

EARTH 上的什么让您认为处理类型不匹配错误的最佳方法就是强制转换它?您需要修复 HookProc,使其实际上是正确的函数。

【讨论】:

  • 如果没有类型不匹配。为什么要选演员?
猜你喜欢
  • 2018-01-12
  • 1970-01-01
  • 2017-10-05
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多