求助,帮忙看一个全局HOOK

cfvgodot 2012-05-03 04:34:01
做了一个全局的HOOK捕获用户对BUTTON的点击状态,其中有个难搞的问题,见代码

#pragma data_seg ("share")

callBack_fun=NULL; //已经有共享数据段了,传值没问题

#pragma data_seg()

typedef void (CALLBACK* callBack)();

C/C++ code

extern "C" _declspec(dllexport) char* _stdcall EnableHook(HWND hwnd,int message,callBack fun)
//加了一个回调函数的参数,目的在于检测到目标动作之后自动回调方法。
{
_fun=fun;
_fun();//这里执行是没有问题的
}

LRESULT CALLBACK GetMsgProc( int code, WPARAM wParam,LPARAM lParam)
{
_fun();//放在HOOK的回调里边执行就有问题了,想问问要怎么搞这个问题。
}

...全文
259 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cfvgodot 2012-06-18
  • 打赏
  • 举报
回复
额。。。自己搞定的

还是厚道一点 发布一下解决方法

因为HOOK是全局的,所以分别注入不同的进程内,其他进程内无法找到回掉函数的地址。

只能用SOCKET跨进程通信了,发消息回来,然后执行。

结贴了
cfvgodot 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

我觉得应该可以,这句话怎么看着别扭,typedef void (CALLBACK* callBack)();
你把CALLBACK去掉看一下
[/Quote]

嗯,看着舒服不舒服关系不太的,主要是全局的钩子,在注入的目标程序进程里有一个线程,而回调的方法是跨线程的
SONG_CA 2012-05-04
  • 打赏
  • 举报
回复
我觉得应该可以,这句话怎么看着别扭,typedef void (CALLBACK* callBack)();
你把CALLBACK去掉看一下
cfvgodot 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

PostMessaeg不可以吗?

dll发到 exe里。。。。


PostThreadMessage倒是不可以,跨模块,不能把
[/Quote]

DLL发到EXE里?具体点呗。。。
cfvgodot 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

SendMessage,pipe,socket随你用
[/Quote]

SENDMESSAGE。。。。。你的意思是用SENDMESSAGE直接发消息给控件是么。。。。SOCKET倒是可以实现,不过这样的话,处理非常麻烦了,要很多的开发工作需要做。

唉 好头疼啊,本来是想在C#里边用一个委托来搞定的,结果发现好像实现很困难
baitiane7100 2012-05-03
  • 打赏
  • 举报
回复
PostMessaeg不可以吗?

dll发到 exe里。。。。


PostThreadMessage倒是不可以,跨模块,不能把
Lactoferrin 2012-05-03
  • 打赏
  • 举报
回复
SendMessage,pipe,socket随你用
cfvgodot 2012-05-03
  • 打赏
  • 举报
回复
自己顶一下先
cfvgodot 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

发消息给那个进程
[/Quote]

啊。。。能具体点不 大侠
Lactoferrin 2012-05-03
  • 打赏
  • 举报
回复
发消息给那个进程
cfvgodot 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

fun的代码必须在dll
[/Quote]

额....那样的话也就不需要回调了


如果不在DLL里 有办法么?
Lactoferrin 2012-05-03
  • 打赏
  • 举报
回复
fun的代码必须在dll
cfvgodot 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

WH_GETMESSAGE钩子?

If code is less than zero, the hook procedure must return the value returned by CallNextHookEx.

If code is greater than or equal to zero, it is highly recommended that you cal……
[/Quote]

恩 是的,钩子本身是没问题的 该处理的都能处理,就是那个回调 我希望的是钩子的DLL在捕获完成之后,能够回调我应用程序的函数,这样方便处理,但是在钩子的回调函数里怎么也不能执行那个回调,放到EnableHook这里执行是没有问题的
cfvgodot 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

WH_GETMESSAGE钩子?

If code is less than zero, the hook procedure must return the value returned by CallNextHookEx.

If code is greater than or equal to zero, it is highly recommended that you cal……
[/Quote]

恩 是的,钩子本身是没问题的 该处理的都能处理,就是那个回调 我希望的是钩子的DLL在捕获完成之后,能够回调我应用程序的函数,这样方便处理,但是在钩子的回调函数里怎么也不能执行那个回调,放到EnableHook这里执行是没有问题的
Eleven 2012-05-03
  • 打赏
  • 举报
回复
WH_GETMESSAGE钩子?

If code is less than zero, the hook procedure must return the value returned by CallNextHookEx.

If code is greater than or equal to zero, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_GETMESSAGE hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure does not call CallNextHookEx, the return value should be zero.

15,471

社区成员

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

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