如果我使用相同的消息,为什么wparam会改变?

时间:2011-02-18 01:28:44

标签: c++ c windows winapi

我目前正在尝试将http://www.codeproject.com/KB/threads/winspy.aspx(子类化部分)中的一些代码实现到我的项目中,但遇到一些问题,我调试了dll,而且当我发送完全相同的消息(或者我认为)时钩子线程的hwnd消息看起来是不同的(我看到这要归功于通过visual studio直接调试dll文件)。

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

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

#pragma data_seg("Shared")
UINT    WM_HOOKEX = 0;
#pragma data_seg()

好的时候在dll附加时注册它......

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    if( ul_reason_for_call == DLL_PROCESS_ATTACH ) 
    {
        g_hInstDll = (HINSTANCE) hModule;   
        ::DisableThreadLibraryCalls( g_hInstDll );

        if( WM_HOOKEX==NULL )
            WM_HOOKEX = ::RegisterWindowMessage( _T("WM_HOOKEX_RK") );          
    }

    return TRUE;
} 

最后我挂钩线程后发送消息

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?

谢谢

1 个答案:

答案 0 :(得分:2)

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

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

将其重写为

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

EARTH上的内容让您了解处理类型不匹配错误的最佳方法就是投射它?您需要修复HookProc,因此它实际上是正确的功能。