SetWindowsHookEx函数

VinceJava 2017-07-13 09:53:22
在mydll中我启动一个钩子,如下。
SetWindowsHookEx(WH_GETMESSAGE, MYHOOKPROC, hin, threadId);

然后再写一个控制台程序,去获取要钩的窗口进程threadid 传入,钩子能创建成功但是无法相应消息。如果 threadid传入为0 却可以响应。
流程大概就这样:主线程调用如下:

hwnd = FindWindow(TEXT("Progman"), NULL);
threadId = GetWindowThreadProcessId(hwnd, &pid);; // 我获取这个进程的子线程或者子线程的子线程都不行
HINSTANCE hi = LoadLibrary(TEXT("../../HookDll/Debug/HookDll.dll"));
LOADHOOK lh = (LOADHOOK)GetProcAddress(hi, "LOADHOOK");
lh(threadId);;

在dll中的LOODHOOK方法直接 SetWindowsHookEx(WH_GETMESSAGE, MYHOOKPROC, hin, threadId);
LRESULT CALLBACK MYHOOKPROC(int code, WPARAM w, LPARAM l) {
MessageBox(........) //如果threadid传入为0即可调用,但是传入线程id就调用不了,新手求指点。

是这样的,我希望拦截打开应用程序的消息,然后给弹窗是否做选择,我试过很多网上的办法 但是现在都卡在这地方。真的不知道是哪里错了。
...全文
595 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不清楚你所说的 打开应用程序的消息指的是什么?
VinceJava 2017-07-13
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
参考 WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/ 源代码相关片断。
找到了两个入口点 在下刚接触win api 以前也没用c系列的语言做过项目, 怕有漏掉的内容,所以把入口点下面所有 调用都查了个遍-、-。没找到想要的部分,不过还是有收获,看到了他 调用setwindowsex注册了一个键盘监听-、-和我注册的方式是一的
zgl7903 2017-07-13
  • 打赏
  • 举报
回复
那可以试试 在 GetMsgProc 中比较窗口句柄, 不符合的直接Pass
VinceJava 2017-07-13
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
SetWindowsHookEx 是否成功?
成功的,断点的时候看到是有值非空的,getlasterror 获取的返回值也是0.
zgl7903 2017-07-13
  • 打赏
  • 举报
回复
SetWindowsHookEx 是否成功?
赵4老师 2017-07-13
  • 打赏
  • 举报
回复
参考 WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/ 源代码相关片断。
VinceJava 2017-07-13
  • 打赏
  • 举报
回复
我调试进去的话每个地方都可以正常获取,钩子也能开启 SetWindowsHookEx 也有返回,但就是传入threadid 回调方法完全不调用。

2,640

社区成员

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

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