12月27午间12点前参与者:钩子安装成功,但不进回调函数

12月27中午12点前参与者:钩子安装成功,但不进回调函数
共享数据:

#pragma data_seg("SHAREDMEM")
HHOOK g_hHook = NULL;
HWND g_pptHwnd = NULL;
#pragma data_seg()

#pragma comment(linker, "/Section:SHAREDMEM,rws")


安装钩子:


HINSTANCE   glhInstance=NULL; 
glhInstance=GetModuleHandle(L"Win32Project1.dll");
{
HWND pWnd = FindWindow(L"screenClass", NULL);

        g_pptHwnd = FindWindowEx(pWnd, NULL, L"paneClassDC", L"幻灯片放映");
        if (g_pptHwnd == NULL)
            {
                //繁体版本处理
                g_pptHwnd = FindWindowEx(pWnd, NULL, L"paneClassDC", L"投影片放映");
                if (g_pptHwnd == NULL)
                {
                    return ;
                }
            }
}
DWORD dwProcessId = 0;
DWORD dwThreadId = 0;
dwThreadId = GetWindowThreadProcessId(g_pptHwnd,&dwProcessId);
g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,glhInstance,dwThreadId);
DWORD dw = 0;
if(g_hHook == NULL)
{
Error("SetWindowsHookEx");
return;
}


回调函数:
LRESULT CALLBACK GetMsgProc(          int code,
    WPARAM wParam,
    LPARAM lParam
)
{
return CallNextHookEx(g_hHook, code, wParam, lParam);

}

如上,获取到ppt全屏播放句柄后,用钩子截获。安装钩子成功,但是始终不进GetMsgProc回调函数。

如果改为:g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,glhInstance,0);
成功,可以进回调函数,也是正确的全局钩子。求解

2012.12.27中午12点前参与有分



------解决方案--------------------
会不会是因为钩子的回调函数的实现不在SetWindowsHookEx指定线程的进程地址空间内呢?

MSDN对于dwThreadId参数的说明:
The identifier of the thread with which the hook procedure is to be associated. 
意思是hook procedure需要与thread进行associate.
------解决方案--------------------
SetWindowsHookEx( )函数的最后一个参数设置错误。dwThreadId用来指定与钩子过程相关的线程ID,如果其值为0,那么安装的钩子过程将与桌面上运行的所有线程都相关
------解决方案--------------------
这个最后那个参数,建议为0,
我也遇到楼主一样的问题.
不知道原因
这个是MSDN的解释.
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. 

------解决方案--------------------