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

ldl123 2012-12-26 08:28:08
共享数据:

#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点前参与有分


...全文
318 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldl123 2012-12-27
  • 打赏
  • 举报
回复
引用 12 楼 gfm688 的回复:
虽然不能解决楼主的问题,我觉得这样好点: 不用glhInstance=GetModuleHandle(L"Win32Project1.dll");,而在DllMain中赋值 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { glhInstance = hinstDLL; r……
谢谢你,我这样试了,也一样。 时间到,给分先。
gfm688 2012-12-27
  • 打赏
  • 举报
回复
虽然不能解决楼主的问题,我觉得这样好点: 不用glhInstance=GetModuleHandle(L"Win32Project1.dll");,而在DllMain中赋值 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { glhInstance = hinstDLL; return TRUE; }
ldl123 2012-12-27
  • 打赏
  • 举报
回复
昨天一晚上,今天一上午纠结这个问题。 刚才我将windows 核心编程中的示例代码(22-DIPS)下载下来,在本地调试运行,发现也没有进入GetMsgProc,现在怀疑是不是win7系统问题。 我的开发环境:win7+VS2012 等下换个系统测试下。 另:我想改变ppt中的光标,该如何做?直接改没权限,我才想到用注入方式去改,有什么更好办法吗?
ldl123 2012-12-27
  • 打赏
  • 举报
回复
引用 9 楼 gfm688 的回复:
楼主贴的代码都是写在dll里面吗?
是写在dll里,并放在system32下
gfm688 2012-12-27
  • 打赏
  • 举报
回复
楼主贴的代码都是写在dll里面吗?
ldl123 2012-12-27
  • 打赏
  • 举报
回复
引用 7 楼 lfs09 的回复:
dwThreadId = GetWindowThreadProcessId(g_pptHwnd,&dwProcessId); 这句是否有点不当对呢? 一个HWND只有一个线程吗?
我用spy++看了,获取到的值与程序中是一致的。关键是钩子安装成功了,(单步跟是返回有值的)但不进去那个回调函数GetMsgProc。
你妹的特盗不 2012-12-27
  • 打赏
  • 举报
回复
dwThreadId = GetWindowThreadProcessId(g_pptHwnd,&dwProcessId); 这句是否有点不当对呢? 一个HWND只有一个线程吗?
你妹的特盗不 2012-12-27
  • 打赏
  • 举报
回复
这个最后那个参数,建议为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.
ldl123 2012-12-27
  • 打赏
  • 举报
回复
引用 4 楼 jixiang1983 的回复:
SetWindowsHookEx( )函数的最后一个参数设置错误。dwThreadId用来指定与钩子过程相关的线程ID,如果其值为0,那么安装的钩子过程将与桌面上运行的所有线程都相关
如果是错误的,那该如何设置?
Gordon_Freeman 2012-12-27
  • 打赏
  • 举报
回复
引用 3 楼 ldl123 的回复:
引用 2 楼 hellogmh 的回复:会不会是因为钩子的回调函数的实现不在SetWindowsHookEx指定线程的进程地址空间内呢? MSDN对于dwThreadId参数的说明: The identifier of the thread with which the hook procedure is to be associated. 意思是hook p……
把一个DLL插入到目标进程中,DLL中包含钩子回调函数。插入可以使用远程线程
schlafenhamster 2012-12-27
  • 打赏
  • 举报
回复
hook 类型对不对 ? 试试: WH_CALLWNDPROC
jixiang1983 2012-12-26
  • 打赏
  • 举报
回复
SetWindowsHookEx( )函数的最后一个参数设置错误。dwThreadId用来指定与钩子过程相关的线程ID,如果其值为0,那么安装的钩子过程将与桌面上运行的所有线程都相关
ldl123 2012-12-26
  • 打赏
  • 举报
回复
引用 2 楼 hellogmh 的回复:
会不会是因为钩子的回调函数的实现不在SetWindowsHookEx指定线程的进程地址空间内呢? MSDN对于dwThreadId参数的说明: The identifier of the thread with which the hook procedure is to be associated. 意思是hook procedure需要与thread进行a……
请问能否详细点?如何关联?
Gordon_Freeman 2012-12-26
  • 打赏
  • 举报
回复
会不会是因为钩子的回调函数的实现不在SetWindowsHookEx指定线程的进程地址空间内呢? MSDN对于dwThreadId参数的说明: The identifier of the thread with which the hook procedure is to be associated. 意思是hook procedure需要与thread进行associate.
ldl123 2012-12-26
  • 打赏
  • 举报
回复
先自己顶起来

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧