UltraRun is released

Posted on 2008-08-17 08:09  Samson小天  阅读(595)  评论(1编辑  收藏  举报

Summary:

          本文所讲的技术:底层键盘Hook拦截Win+R系统快捷键,使用全局互斥变量使程序同一时间只有一个实例启动。

 

Detail:

          捂了那么多天,UltraRun终于决定还是拿出来亮亮相吧。UltraRun是我处于英文狂的时候开发的,所以所有界面都是E文的。不过这里有点技术还是值得说一下的。

          UltraRun是作为Windows Run的替代品(其界面如下),是不是发现很想Windows的“运行”,其实本来就是照着那个样子做的,只是功能上拓展了下而已。

          

          拓展的选项,可以用昵称启动自己想要的程序:

          

          这里我要讲的第一个技术是使用底层键盘HOOK来拦截Win+r这个系统快捷键。大家都知道键盘上Windows键和R键一起按就启动了Windows的“运行”功能。这个快捷键是系统全局热键,不仅不让你重新注册,启动后连事件都不转发一个的。所以呢,要想替代这个快捷键,我就想到了用底层键盘HOOK。

          首先送上HOOK代码,本段代码摘自CodeProject,并且经过修改,修正了HookProc被回收的问题。

          

Code

 

          这段代码本来是没有

          public keyboardHookProc HProc;

          HProc = new keyboardHookProc(hookProc);

          这两句的,因为原作者并不让窗体隐藏,所以不会造成窗体中的一些方法被回收。但是我的程序会在后台运行,所以当垃圾回收器回收内存的时候,我的HOOK因为没有窗体对其引用就被回收掉了。要阻止这种情况发生,就让程序中始终有一个变量对这个方法保留一个引用即可。所以就有了上面两句。另外原作者有对鼠标也HOOK,这里没什么作用就没有贴出啦。

          这里当然也对读者们一个建议,HOOK是降低系统稳定性,并且太BT的HOOK会被杀毒软件拦截。大家可以在我的HOOKPROC方法中看到,我只判断了WIN键和R键,如果我把这两句判断去掉,对所有的按键照单全收,那么就是一个键盘记录器,也就是一个键盘记录木马。所以大家在使用的时候也要考虑清楚,是否有必要用HOOK。

 

 

          另外一个今天要讲的就是利用全局互斥变量是程序只有一个实例运行。应当说网上方法也有很多,这也是我找到的其中一个方法,用这个方法因为我认为这是其中最好的。

          这里简单对其他几个方法介绍下,有一个是遍历当前系统中所有进程,如果和当前进程相同,就提示“不能运行两个相同的程序”。乍看之下没什么问题,但事实上,进程是和文件名相同的,我复制一个文件,并改一下名字就可以双开了。或者有一个和你不同的程序,只是程序的可执行文件名字和你的相同,结果也会被误判为双开。

          还有一个方法是当程序启动的时候在某处做一个记号,比如注册表某个值设为1,关闭后在设置为0。这方法也不错,不过这里告诉大家一个另外一个方法——利用全局互斥变量。

          这个东西本来是用于线程间通讯的,也可以用作进程间通信。大家都知道静态变量(static),在整个程序的任意时刻都能被访问到,它在程序启动时就分配空间,程序退出是才释放。一个类中的静态变量不会被多次分配,也就是说一次只会有一个相同名字的静态变量。而全局互斥变量就有点像进程间的static变量,只是功能更强大(这里只提到一点,其实还有很多特性的,具体请参考 Wrox的《C#高级编程 & .net 3.0》)。

          这里给出代码给大家参考:

 

Code

Copyright © 2024 Samson小天
Powered by .NET 9.0 on Kubernetes