引言
通常情况下,用于后台监控的服务程序(service)是没有界面的,甚至也没有提供任务栏图标,因此绝大多数情况下服务程序是无法同用户进行交互的。 但是在实际应用中,这些服务程序虽然绝大多数时间是在后台运行,但是在某些必要的情况下还是需要用户的干预并同用户进行一些必要的交互操作。但是由于服务程序没有提供任何可供交互操作之用的界面,因此如何将其从后台激活(即呼出)成为解决此问题的一个关键。本文下面就给出一种通过设置系统热键的方法来激活运行于后台的服务程序。
设计思路
尽管从理论上可以有许多方法来激活后台运行的服务程序,比如可以通过寻找服务程序的窗口标题名而得到其窗口指针,然后再向此窗口发送消息使其出现到前台;也可以通过系统快照对当前系统进程进行枚举,然后再将其激活到前台。但是以上这些方法都需要另外编写应用程序,对后台服务程序的激活实际是再这些应用程序中进行的,这样的处理方式显然十分不便,最好的方法是对程序的激活和隐藏处理均在服务程序内部完成。因此可以考虑接收系统发出的消息,如果通过设置全局钩子对设置事件进行拦截捕获,显然是相当烦琐的。在此考虑使用系统热键来激活后台服务程序,其实现过程非常简单,只需先向操作系统添加一个全局原子(atom),然后再向操作系统登记一个热键,当程序在后台运行期间一旦有此热键按下,操作系统将会抛出系统消息wm_hotkey,所以服务程序只需在wm_hotkey消息响应函数中添加相应代码即可实现服务程序的后台激活。
系统热键的注册
根据前面的介绍,不难写出为后台服务程序添加对系统热键响应的功能代码。首先通过函数globalfindatom()查询本服务程序所对应的全局原子是否已存在于全局原子表中,如果发现,则说明系统中已经存在有此服务,程序退出。如果没有发现,则通过globaladdatom()函数向全局原子表添加一个字串,并获取得到一个唯一标识此字串的原子。以上两函数原型分别为:
| atom globalfindatom(lpctstr lpstring); atom globaladdatom(lpctstr lpstring); |
| bool registerhotkey(hwnd hwnd, // 接收热键响应的窗口句柄 int id, // 热键的标识 uint fsmodifiers, // 控制键标志 uint vk // 虚拟键值 ); |
| // 获取当前窗口句柄 hwnd handle = getsafehwnd(); // 寻找hotkey对应的原子是否存在于原子列表 if(globalfindatom("hotkey") == 0) { // 如果没有存在于原子列表,则创建一个原子 id = globaladdatom("hotkey"); //注册全局热键ctrl + alt + r registerhotkey(handle, id, control + alt, r); } else // 如果hotkey已经存在于原子列表,则终止程序运行 postquitmessage(0); |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器