.Net不能做消息钩子(WH_GETMESSAGE)吗?

socg 2009-02-26 04:58:59
用C#做键盘钩子和鼠标钩子都可以,全局和线程的都没问题,可是做WH_GETMESSAGE总是不成功,用C++可以,但是翻译成C#就不行了。

安装钩子是成功的,但是钩子委托只会执行一次,不知道是什么原因。

已下代码放是放在dll中的


public class MyHook
{
const int WH_GETMESSAGE=3;

[DllImport("user32.dll")]
public static extern IntPtr SetWindowsHookEx(int hookType,HookProc hookProc,IntPtr instance,int threadID);
[DllImport("user32.dll")]
public static extern IntPtr CallNextHookEx(IntPtr hookHandle, int nCode, IntPtr wParam, IntPtr lParam);

public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);

static IntPtr hookHandle=IntPtr.Zero;//钩子的句柄

/// <summary>
/// 安装钩子
/// </summary>
/// <returns></returns>
public static bool SetHook()
{
IntPtr h=Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
hookHandle = SetWindowsHookEx(WH_GETMESSAGE,new HookProc(HookCallBack),h,0);
if(hookHandle==IntPtr.Zero)
{
System.Windows.Forms.MessageBox.Show("安装失败了");
return false;
}
return true;
}


public static IntPtr HookCallBack(int nCode,IntPtr wParam,IntPtr lParam)
{
System.Diagnostics.Debug.WriteLine("有消息近来了");//只会执行一次

if(nCode < 0)
{
CallNextHookEx(hookHandle,nCode,wParam,lParam);
return IntPtr.Zero;
}
else
{
return CallNextHookEx(hookHandle,nCode,wParam,lParam);
}
}


}



谁.Net做出消息钩子的共享一下代码,不胜感激
...全文
325 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
socg 2009-02-27
  • 打赏
  • 举报
回复
接帖了


最后问一下shrinerain :
是不是鼠标和键盘钩子只能做全局的,而不能做线程钩子去钩非托管程序的线程?
xiaofei0804 2009-02-26
  • 打赏
  • 举报
回复
学习~~~
shrinerain 2009-02-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 socg 的回复:]
果然....


难怪我用线程的消息钩子时钩自己的线程可以成功,但钩其他线程就失败


太遗憾了....
[/Quote]

hook其他线程的消息, 实质工作原理就是将dll注入到其他线程, 所以你才能hook到.

而.net的dll由于是托管代码, 是不能注入到native code的线程中的. 所以, 你的需求纯.net是无能为力的.

之所以能hook到鼠标键盘, 那是因为这两个是特殊消息, 并不属于用户态某个线程所有.

homejiji 2009-02-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shrinerain 的回复:]
对于全局消息hook, .Net只能Hook鼠标键盘消息. 不能hook其他进程.

因为.Net托管代码的dll不能注入到非托管代码的进程里面. 所以不能hook其他进程的消息.
[/Quote]
mark
jlj84237485 2009-02-26
  • 打赏
  • 举报
回复
帮顶一下
I_am_Z 2009-02-26
  • 打赏
  • 举报
回复
up
socg 2009-02-26
  • 打赏
  • 举报
回复
果然....


难怪我用线程的消息钩子时钩自己的线程可以成功,但钩其他线程就失败


太遗憾了....
shrinerain 2009-02-26
  • 打赏
  • 举报
回复
对于全局消息hook, .Net只能Hook鼠标键盘消息. 不能hook其他进程.

因为.Net托管代码的dll不能注入到非托管代码的进程里面. 所以不能hook其他进程的消息.
ls3697264 2009-02-26
  • 打赏
  • 举报
回复
UP
socg 2009-02-26
  • 打赏
  • 举报
回复
linaren:我认为windows是先处理消息钩子的,因为当钩到键盘消息时甚至可以修改键值,而键盘钩子却修改不了,这也是我选择消息钩子的一个原因。看看这个帖子http://topic.csdn.net/u/20070416/18/d6e3c52b-ed7d-4591-99d8-dbaa82b2f8bc.html
socg 2009-02-26
  • 打赏
  • 举报
回复
fuyuxin19801120:我要钩的是其它进程的消息,重写WndProc()达不到效果
Jack2013tong 2009-02-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/huwei2003/archive/2008/10/24/3136787.aspx
请看看有没有你要的信息
天乐 2009-02-26
  • 打赏
  • 举报
回复
我在.NET3.5的WPF项目中钩过,不过不是全局勾。待会儿试试.NET2.0下的,成功了就发给你。
fuyuxin19801120 2009-02-26
  • 打赏
  • 举报
回复
重写winproc函数
fuyuxin19801120 2009-02-26
  • 打赏
  • 举报
回复
重写winproc函数
linaren 2009-02-26
  • 打赏
  • 举报
回复
C++下钩子程序倒弄过点,C#学习学习,关注中
linaren 2009-02-26
  • 打赏
  • 举报
回复
有可能WH_GETMESSAGE消息是在钩子处理之前处理的,
毕竟window系统是要控制你安装的钩子的

110,953

社区成员

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

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

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