首页新闻找找看学习计划

注册全局鼠标钩子后用鼠标点击窗口上最大化、最小化、关闭窗口界面卡死

0
悬赏园豆:200 [已解决问题] 解决于 2012-08-17 12:59

开发环境:vs2010 C# WinForm windows7 x86    下载Demo

我的问题可以一句话描述:

注册全局鼠标钩子后用鼠标点击窗口上最大化、最小化、关闭窗口界面卡死

 

滚动到本文结尾查看问题的新发现  查看结帖说明


  找到问题的关键点我也花了不少功夫,一点点地测试出来的。最后才发现是安装全局鼠标hook造成的。我现在把他单独拿出来作为demo,寻找解决办法.

 

  UserActivityHook 这个类里面 506 行是执行安装全局hook的方法,其中第一个参数表示是否安装全局鼠标hook,第二个则是键盘的,如果只安装键盘不安装鼠标的则不会出现这个问题。

  我在网站找了好多个论坛和博客,也有遇到类似问题的,有的是易语言,有的是.net,最后都是没解决。参考这个贴子 不过他是vc,也会出现这个问题,我想这是不是windows api的一个bug啊?

  我想这个问题应该不是没有办法解决只是我太菜了,而且大家手头上没有demo,没有办法测试。所以这次我就把这个demo发上来,希望.net方面的高手能帮我测试一下,找出问题并解决它。毕竟这是个很典型的问题,小弟在此谢过!(我有200个园豆,就全部拿出来吧!)


  有人说要添加消息循环,事实上不添加消息循环,hook根本没办法安装成功,我试过,所以不是这个问题。有人说是要新建线程,我也新建线程了,但问题依旧。其实我不是很懂消息循环,随便猜测的是不是消息循环就是在ui线程上工作啊,所以新建线程也没用,还是UI线程。

  奇怪又有趣的是,如果不用鼠标用快捷键,按alt+空格 然后再按x ,这样最大化就不会卡。晕。。。

下载Demo

 

这个问题我也同时在CSDN论坛上提问,看看能不能解决吧!

 

刚才在百度知道上提问,发现百度知道也有人提问过这个问题: 

http://zhidao.baidu.com/question/52788169.html 

http://zhidao.baidu.com/question/69554420.html

不过他这是vc 我这是c#, 看来这应该不是.net本身的问题,而是windows api的问题!!是吗?

 


重大发现:我快疯了,发现了更奇怪的问题!

看到回帖好几位朋友说测试没有毛病,我就多找了几台同事电脑测试,有的行有的不行。最后终于发现规律:

1、凡是采用windows 经典主题的就没问题;

2、凡是不采用经典主题的都会多少出现卡的情况,winxp 卡的时候短点儿,但也会卡,win7非经典主题下卡的最为严重!这是什么毛病呢?

 






 结贴说明:

这个问题最后还是没解决,等了两天也再没有新的答案。估计非常棘手,恐怕要微软的工程师才能解决。所以结贴吧,毕竟 Launcher 和 狼Robot 帮助我不停地测试。而且  Launcher 还教我一些技巧。在此对二位表示感谢。

 

最后做个问题总结:

还是用一句话吧:采用windows非经典主题时注册全局鼠标钩子后用鼠标点击窗口上最大化、最小化、关闭窗口界面卡死。

这应该是一个系统的bug或者api的bug,毕竟从互联网上可以看到VC、.net 还有易语言等多种开发环境都出现过这个问题,没有一个解决的。虽然我很菜,但是会继续关注解决办法,毕竟是一个不小的问题.

 

xuyongtong的主页 xuyongtong | 初学一级 | 园豆:26
提问于:2012-08-14 22:30
< >
分享
最佳答案
0

把你的实现钩子的代码放到一个独立的DLL试试。

http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

 

我测试了你使用的这个封装类,原作者提供的DEMO可以正常运行,点击最小、最大、关闭都没有你说的那种情况出现。我的操作系统是Windows7 x64.

收获园豆:120
Launcher | 高人七级 |园豆:45045 | 2012-08-15 09:52

奇怪,难道说只有x86会出现这种情况!不过也是非常典型的,我看到网上不止我一个遇到这个问题。

用x86的高手继续帮我看一下!谢谢谢谢!

xuyongtong | 园豆:26 (初学一级) | 2012-08-15 11:16

我按照您说的把 UserActivityHook  这个类单独放在一个dll中 问题依旧  (系统win7 x86)

xuyongtong | 园豆:26 (初学一级) | 2012-08-15 11:43

@xuyongtong: 我仔细看了下你的代码,首先把UserActivityHook放置在Form_Load中,同时把你注释掉的UserActivityHook(){Start();}取消掉。也就是说一切按照原作者的方式来。按照你的另启动线程来做,也没有问题。只有在调试的时候会有问题,你必须把项目-属性-调试-启用Visual Studio 承载进程的勾去掉。

如果在x86机器上不能正确运行,你可以在生成里将目标平台修改为 x86 测试下。

Launcher | 园豆:45045 (高人七级) | 2012-08-15 11:45

@Launcher: 我按照您的方法修改了,还是不行,您测试一直没问题吗?看来这个情况只会在x86系统的发生.非常感谢您!

xuyongtong | 园豆:26 (初学一级) | 2012-08-15 12:02

@xuyongtong: 我测试一直没问题,目前没有x86环境,无法验证。

Launcher | 园豆:45045 (高人七级) | 2012-08-15 13:07

@Launcher: 您好,看到回帖好几位朋友说测试没有毛病,我就多找了几台同事电脑测试。最后终于发现规律:凡是采用windows 经典主题的就没问题;凡是不采用经典主题的都会多少出现卡的情况,x64的系统不知道是不是这样的,您有空再测试一下!

xuyongtong | 园豆:26 (初学一级) | 2012-08-15 15:24

@xuyongtong: 如何把Windows 7的主题设置为非经典?

Launcher | 园豆:45045 (高人七级) | 2012-08-15 15:31

@Launcher: 桌面空白处右击--个性化,选择windows 7 或者windows 7 basic 都可以。

xuyongtong | 园豆:26 (初学一级) | 2012-08-15 16:44

@xuyongtong: 测试了下使用 Windows 7 Basic和Windows 金典,最小、最大化会有界面停止响应的间隔,并且,前者比后者更明显。使用 Aero 主题则没有这个问题。

Launcher | 园豆:45045 (高人七级) | 2012-08-15 16:52
其他回答(3)
0

你的下载连接后面多了个空格

收获园豆:10
刀是什么样的刀 | 园豆:910 (小虾三级) | 2012-08-15 09:49

谢谢提醒已经去掉了

支持(0) 反对(0) xuyongtong | 园豆:26 (初学一级) | 2012-08-15 11:14
0

win7x64下没问题,你是什么运行环境?

收获园豆:60
I,Robot | 园豆:9461 (大侠五级) | 2012-08-15 11:55

我的系统是win7 x86

支持(0) 反对(0) xuyongtong | 园豆:26 (初学一级) | 2012-08-15 12:02

@xuyongtong: 

win7x86也测了,没问题噢,我是直接运行的你编译好的exe

支持(0) 反对(0) I,Robot | 园豆:9461 (大侠五级) | 2012-08-15 13:53

@狼Robot: 那就是奇怪了,你的电脑配置很高是吧。

程序一打开就是安装了hook的,鼠标移动可以看到坐标的变化,这时候再去点窗口最大化、最小化或关闭测试。

支持(0) 反对(0) xuyongtong | 园豆:26 (初学一级) | 2012-08-15 14:44

@xuyongtong: 您好,终于发现规律了;您的系统是不是采用windows 经典主题的,经典主题不会,您改一下win7主题再帮我测试一下。

支持(0) 反对(0) xuyongtong | 园豆:26 (初学一级) | 2012-08-15 15:26

@xuyongtong: 

我没有用经典主题,win7x64是在本机测试的,win7x86是在虚拟机中测试的,都没有问题。

程序一打开就可以看到鼠标的信息,最大化最小化关闭都点了,没发现问题。

支持(0) 反对(0) I,Robot | 园豆:9461 (大侠五级) | 2012-08-15 17:30
0

遇到同样的问题,希望园主有解决方案后,告知一声

kingspring | 园豆:202 (菜鸟二级) | 2012-11-23 16:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册