masonlu

  BOSS下的新任务,需要一个在软件运行时(非当前句柄)监控鼠标的运动状态(保持静止或发生移动)。google后,基本上所有大牛和小牛的观点都是通过全局钩子来解决问题,然后也就一直按照这个方向找了下去。

  我用的VB,版本是.NET 3.5,网上的例子多为C#或者VB6的,有一些函数已经无法失效了,不过终于在一片MSDN的博客中找到了

例子:http://support.microsoft.com/kb/319524/zh-cn。但是在这个例子的最后,明确说明了.net framework下无法使用全局钩子,MY GOD!

继续google,终于又找到一个希言堂的博客:《.NET中使用钩子》地址:http://www.xioxu.com/?p=122013。这篇文章里关于单个进程的钩子实现方案同

MSDN里的方法基本相同(C#可以转换成VB表示),不过作者在后半篇否定了.net不能使用全局钩子的问题,并且给出了解决方案,该方案的代码经过修改可以

在vb.net中编译通过,但是无法起作用,崩溃!不过作者的源代码是C#的,我没有在C#环境下尝试过,不清楚是否有用,但是VB基本失败了……

  至此基本使用了快一天时间了,而且大部分时间都用来搜集资料,测试代码的时间不多,而且都无法解决问题。本人参加工作时间不长,而且都在托管环境

中进行编码,对消息钩子了解不深,在网上各种方法都无效后,基本进入死胡同了,漆黑漆黑的,不知道怎么能走出去。

终于,不知道哪根筋有点问题,突然想起了之前偶然看到csdn论坛上某人提了一下Control.MousePosition。当时一头钻进全局钩子时没有注意这条,现在在

死胡同里突然又想来了,然后尝试一下……设置一个timer,周期性判断Control.MousePosition的值是否发生变化,OK问题解决了。这个方法虽然比较笨,而且

没有使用钩子这种底层方式,但是仍然在VB.NET上实现了类似全局监控鼠标的效果。

  现在回想一下,这个函数是很早就知道的,但是由于一些先入为主的原因,被钩子钩住了,没有想到这个简单直白的方法,实际工作中也确实经常碰到。

过  去曾经在公司项目的系统中发现一个BUG,在使用serialport控件时,由于外部串口意外断开,造成serialport连接失败后,再重新打开时,总是会出现无

法读取串口的异常,而且这个异常无法通过TRY得到,只有在运行VS进行调试时才会捕捉到,但是也无法得到异常的准确位置,这个异常的直接后果就是程序经常

消失,无论是使用close方法还是dispose方法还是其他的方案,尝试释放对象后进行重新连接,都无法起作用。论坛上也有反映这个问题的,但是一直无人提供解

决方案。最终,我相到了放弃,放弃解决这个问题,但是在有放弃的想法后,我突然发现为什么不放弃这个对象呢?之前一直在已经建立的serialport对象上进行

open和close操作,之后我在出现意外断开并重新连接串口时,重新建立一个对象,而不是在原有对象的基础上进行open,然后,问题解决了……

以上都是很简单的问题,在发现问题的一开始,第一时间想到的都是怎么从底层解决问题,比如钩子,或者控件内部,但是事实上,最简单有效并最终使用的方法

都是很普通很简易的代码和技术,只要换个思维,从最简单的平常事上作文章,就可以解决一个又一个看似很难或者无解的问题。换一个方向,海阔天空!

posted on 2015-08-25 09:44  Masonlu  阅读(281)  评论(0编辑  收藏  举报

分类:

技术点:

相关文章: