当前位置:编程学习 > C#/ASP.NET >>

C#使用SetWindowsHookEx安装钩子以后,只要一有被Hook的消息,进程就异常了,高手帮忙看看。

有一个窗体程序Form1;

另一个程序使用hook来截获这个窗体的消息:

IntPtr pInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().ManifestModule);
IntPtr dwThreadID = GetWindowThreadProcessId(hwnd, IntPtr.Zero);
//hwnd为已经取到的窗体程序Form1的句柄;

this.hookHandle = SetWindowsHookEx((int)Win32HookType.WH_KEYBOARD, hookProc, pInstance, (int)dwThreadID);

返回键盘钩子已经成功安装

但这个时候,我只要一在窗体Form1上按下某个健。则Form1程序就异常推出(我用其他程序,比如记事本,则记事本报异常退出,但如果换成全局钩子的话,则没有问题)

请高手帮忙看看这是什么原因 --------------------编程问答-------------------- 不明白你说啥,接分 --------------------编程问答-------------------- 这说明的你钩子没有安装成功!
SetWindowsHookEx的返回值你测试了?
.net下只能安装本线程的钩子!全局的钩子根本不可能!更别说是别的进程中的线程了!
安装全局钩子,必须把钩子包装到一个标准DLL里边,C#连个标准的DLL都不能写啊!
你需要用非托管语言把全局钩子包装一下,生成一个包装好的DLL,然后使用C#来调用! --------------------编程问答-------------------- zzultc:
 
返回值是正常的,钩子安装成功的。

另外,“.net下全局钩子根本不可能”,包括做dll,那是以前的说法。

在framework2.0以后就可以了。你可以测试一下。 --------------------编程问答--------------------    
  
 
                         没太接触过,帮你顶 --------------------编程问答-------------------- WH_KEYBOARD的确不能安装全局钩子,C#也的确不能写非托管DLL(native Dll)。

但WH_KEYBOARD_LL和WH_MOUSE_LL是例外:安装Low Level鼠标或键盘钩子并没有把Dll模块注入到其他线程中,而是在钩子回调时,上下文切换(Context switch,每个线程都有其独特的上下文)到安装线程。这就是为什么C#不能写非托管DLL,却能安装Low Level键盘钩子的原因。

楼主用了WH_KEYBOARD。如果设计意图是个全局钩子,那就要检讨是否改成WH_KEYBOARD_LL。如果是本进程内的局部钩子,那可以考虑其他的方法,比如消息预处理等。钩子能不用,最好不用。

--------------------编程问答-------------------- 我想要监视另外一个程序窗体是否弹出了dialog对话框。

如果不用钩子拦截消息的话,请给个别的思路吧。谢谢。 --------------------编程问答--------------------
引用 6 楼 3feng 的回复:
我想要监视另外一个程序窗体是否弹出了dialog对话框。 

如果不用钩子拦截消息的话,请给个别的思路吧。谢谢。

呵呵,这样的话,说个笨一点的还不可靠的方法:
可以使用API函数findwindow,当然需要定时执行,比如100毫秒。 --------------------编程问答-------------------- 我先也遇到了这个问题。学习!~ --------------------编程问答-------------------- 我也用的了hook来监视鼠标活动,云里雾里的,不知道返回的什么东西 --------------------编程问答-------------------- 如5楼所说,WH_KEYBOARD需要把钩子回调函数放在dll里面,换用WH_KEYBOARD_LL --------------------编程问答--------------------
引用 2 楼  的回复:
这说明的你钩子没有安装成功!
SetWindowsHookEx的返回值你测试了?
.net下只能安装本线程的钩子!全局的钩子根本不可能!更别说是别的进程中的线程了!
安装全局钩子,必须把钩子包装到一个标准DLL里边,C#连个标准的DLL都不能写啊!
你需要用非托管语言把全局钩子包装一下,生成一个包装好的DLL,然后使用C#来调用!

全局钩子肯定可以,我写过一个魔兽快捷键修改工具,非常好用 --------------------编程问答-------------------- 楼主换用WH_KEYBOARD_LL吧,我又试了下原来的程序,肯定行的
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,