C#全局Hook问题,关于WH_GETMESSAGE和WH_MOUSE

heatdragon 2008-12-12 02:07:31
下面这段代码可以实现全局Hook鼠标的位置,
        public void SetHook()
{
Process currentProcess = Process.GetCurrentProcess();
hHook = SetWindowsHookEx(HookType.WH_MOUSE, new HOOKPROC(this.MyMouseProc), (int)currentProcess.MainModule.BaseAddress, 0);
}


下面这段代码可以实现如果鼠标在当前窗口中,可以Hook到鼠标的位置
        public void SetHook()
{
SetWindowsHookEx(HookType.WH_GETMESSAGE,new HOOKPROC(this.MyMouseProc),0,GetCurrentThreadId());
}


那为什么下面这段代码什么也实现不了了呢?
        public void SetHook()
{
Process currentProcess = Process.GetCurrentProcess();
hHook = SetWindowsHookEx(HookType.WH_GETMESSAGE, new HOOKPROC(this.MyMouseProc), (int)currentProcess.MainModule.BaseAddress, 0);
}


请大家注意,我Hook的消息不同。
...全文
1241 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
GFB 2011-05-29
  • 打赏
  • 举报
回复
Managed WH_GETMESSAGE hooks are not supported. A managed DLL can't be injected into just any process, because different versions of the CLR can't be loaded into the same process. See http://support.microsoft.com/default.aspx/kb/318804
wartim 2008-12-13
  • 打赏
  • 举报
回复
wzuomin 2008-12-13
  • 打赏
  • 举报
回复
我这个也只是Hook鼠标键盘
对于 WH_GETMESSAGE ,还没试过呢
wzuomin 2008-12-13
  • 打赏
  • 举报
回复
我原先的那两个链接不知何故打不开了。难道是Csdn出故障了???
先提供一个Hook示例,可以设置全局或线程钩子。

TestHook
http://d.download.csdn.net/down/867789/wzuomin
jingzhongrong 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 heatdragon 的回复:]
文章的意思是说:
例如我的程序叫A,现在要为进程X添加一个键盘钩子,执行过程是
1. X获得焦点,开始执行。
2. 用户按一个键
3. Windows从X接管执行,并把执行的上下文切换到A
4. Windows在A的进程空间中调用为X添加的钩子中的回调函数
5. Windows从A接管执行,并把执行的上下文切换回X
6. Windows把回调函数返回的值放入X的消息队列
7.。。。。。
8.。。。。。

如果添加的是WH_GetMessage类型的钩子,程序的执行始终都是在X的进程空间中,我们的程序A就没法获得消息了。。。

我是纯菜鸟,也不懂对不对,如果可以的话,能告诉我怎么做么?
[/Quote]

1、全局钩子需要使用dll来实现,用于加载到不同进程的进程空间中执行。
2、dll中钩子代码执行在X进程的进程空间中
3、关于如何让A程序获得消息:可以在dll中通过发送自定义消息的方式将消息发送给程序A,A在WindowsProc中处理消息。
4、dll中可以使用共享段来共享全局变量。
5、补充3:进程间的通信方式有多种:内存映射、管道等。
heatdragon 2008-12-13
  • 打赏
  • 举报
回复
day day up!
conan19771130 2008-12-13
  • 打赏
  • 举报
回复
up
perperyu 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 heatdragon 的回复:]
引用 12 楼 pcjbird 的回复:
引用 11 楼 heatdragon 的回复:
引用 8 楼 wzuomin 的回复:
利用Hook屏蔽鼠标及键盘一分钟示例
http://dl2.csdn.net/down4/20080321/21232150801.exe

源码请到这儿下载:
http://download.csdn.net/source/392508

谢谢你!
我下午又阅读了几篇文章,发现C#要想添加WH_GETMESSAGE型的Hook是不可以的。。。。
http://www.codeproject.com/KB/system/globalsystemhook.aspx

要…
[/Quote]
...睡觉 明天看
heatdragon 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 li45214521 的回复:]
是全局钩子
其实都可以不用Dll的,只要模块的映射的地址
[/Quote]

能说具体些,或者给些参考资料吗?我纯菜。。。
heatdragon 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pcjbird 的回复:]
引用 11 楼 heatdragon 的回复:
引用 8 楼 wzuomin 的回复:
利用Hook屏蔽鼠标及键盘一分钟示例
http://dl2.csdn.net/down4/20080321/21232150801.exe

源码请到这儿下载:
http://download.csdn.net/source/392508

谢谢你!
我下午又阅读了几篇文章,发现C#要想添加WH_GETMESSAGE型的Hook是不可以的。。。。
http://www.codeproject.com/KB/system/globalsystemhook.aspx

要怎么办呢。。。


C#要想添加WH_GETM…
[/Quote]

文章的意思是说:
例如我的程序叫A,现在要为进程X添加一个键盘钩子,执行过程是
1. X获得焦点,开始执行。
2. 用户按一个键
3. Windows从X接管执行,并把执行的上下文切换到A
4. Windows在A的进程空间中调用为X添加的钩子中的回调函数
5. Windows从A接管执行,并把执行的上下文切换回X
6. Windows把回调函数返回的值放入X的消息队列
7.。。。。。
8.。。。。。

如果添加的是WH_GetMessage类型的钩子,程序的执行始终都是在X的进程空间中,我们的程序A就没法获得消息了。。。

我是纯菜鸟,也不懂对不对,如果可以的话,能告诉我怎么做么?
li45214521 2008-12-12
  • 打赏
  • 举报
回复
是全局钩子
其实都可以不用Dll的,只要模块的映射的地址
pcjbird 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 heatdragon 的回复:]
引用 8 楼 wzuomin 的回复:
利用Hook屏蔽鼠标及键盘一分钟示例
http://dl2.csdn.net/down4/20080321/21232150801.exe

源码请到这儿下载:
http://download.csdn.net/source/392508

谢谢你!
我下午又阅读了几篇文章,发现C#要想添加WH_GETMESSAGE型的Hook是不可以的。。。。
http://www.codeproject.com/KB/system/globalsystemhook.aspx

要怎么办呢。。。
[/Quote]

C#要想添加WH_GETMESSAGE型的Hook是不可以的???????????????
不要乱讲啦。。。
heatdragon 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wzuomin 的回复:]
利用Hook屏蔽鼠标及键盘一分钟示例
http://dl2.csdn.net/down4/20080321/21232150801.exe

源码请到这儿下载:
http://download.csdn.net/source/392508
[/Quote]
谢谢你!
我下午又阅读了几篇文章,发现C#要想添加WH_GETMESSAGE型的Hook是不可以的。。。。
http://www.codeproject.com/KB/system/globalsystemhook.aspx

要怎么办呢。。。
heatdragon 2008-12-12
  • 打赏
  • 举报
回复
up!!!先去上课,回头仔细研究一下,谢谢大家!
hangang7403 2008-12-12
  • 打赏
  • 举报
回复
up
wzuomin 2008-12-12
  • 打赏
  • 举报
回复
利用Hook屏蔽鼠标及键盘一分钟示例
http://dl2.csdn.net/down4/20080321/21232150801.exe

源码请到这儿下载:
http://download.csdn.net/source/392508
pcjbird 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 heatdragon 的回复:]
to cpio
哦。那为什么第一段代码当鼠标移出窗口时,也能Hook到指针的位置(我不清楚这叫不叫全局Hook,但是,似乎没有生成dll文件),第二段代码不可以,第三段代码什么功能都实现不了。。。
[/Quote]

鼠标以及键盘等都是全局共享的,只是当前应用程序初始化了一个实例,移到窗口外自然也能收到鼠标消息,但是其他线程消息就不是啦!!!
pcjbird 2008-12-12
  • 打赏
  • 举报
回复
系统钩子(全局钩子)要写做成单独的dll.
heatdragon 2008-12-12
  • 打赏
  • 举报
回复
to cpio
哦。那为什么第一段代码当鼠标移出窗口时,也能Hook到指针的位置(我不清楚这叫不叫全局Hook,但是,似乎没有生成dll文件),第二段代码不可以,第三段代码什么功能都实现不了。。。
加载更多回复(3)

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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