选择显示字体大小

vc实现系统热键激活后台服务程序

  引言

  通常情况下,用于后台监控的服务程序(service)是没有界面的,甚至也没有提供任务栏图标,因此绝大多数情况下服务程序是无法同用户进行交互的。 但是在实际应用中,这些服务程序虽然绝大多数时间是在后台运行,但是在某些必要的情况下还是需要用户的干预并同用户进行一些必要的交互操作。但是由于服务程序没有提供任何可供交互操作之用的界面,因此如何将其从后台激活(即呼出)成为解决此问题的一个关键。本文下面就给出一种通过设置系统热键的方法来激活运行于后台的服务程序。

  设计思路

  尽管从理论上可以有许多方法来激活后台运行的服务程序,比如可以通过寻找服务程序的窗口标题名而得到其窗口指针,然后再向此窗口发送消息使其出现到前台;也可以通过系统快照对当前系统进程进行枚举,然后再将其激活到前台。但是以上这些方法都需要另外编写应用程序,对后台服务程序的激活实际是再这些应用程序中进行的,这样的处理方式显然十分不便,最好的方法是对程序的激活和隐藏处理均在服务程序内部完成。因此可以考虑接收系统发出的消息,如果通过设置全局钩子对设置事件进行拦截捕获,显然是相当烦琐的。在此考虑使用系统热键来激活后台服务程序,其实现过程非常简单,只需先向操作系统添加一个全局原子(atom),然后再向操作系统登记一个热键,当程序在后台运行期间一旦有此热键按下,操作系统将会抛出系统消息wm_hotkey,所以服务程序只需在wm_hotkey消息响应函数中添加相应代码即可实现服务程序的后台激活。

  系统热键的注册

  根据前面的介绍,不难写出为后台服务程序添加对系统热键响应的功能代码。首先通过函数globalfindatom()查询本服务程序所对应的全局原子是否已存在于全局原子表中,如果发现,则说明系统中已经存在有此服务,程序退出。如果没有发现,则通过globaladdatom()函数向全局原子表添加一个字串,并获取得到一个唯一标识此字串的原子。以上两函数原型分别为:

atom globalfindatom(lpctstr lpstring);
atom globaladdatom(lpctstr lpstring);

  其中,输入参数为一个描述原子的字符串,如果globalfindatom()从全局原子表中找到了指定的字串,那么将返回此字串对应的原子,否则返回0。globaladdatom()如果创建成功,将返回一个新创建的原子。
接下来,为了能在程序运行期间捕获到系统热键,需要通过registerhotkey()定义一个系统范围的热键。该函数原形如下:

bool registerhotkey(hwnd hwnd, // 接收热键响应的窗口句柄
int id, // 热键的标识
uint fsmodifiers, // 控制键标志
uint vk // 虚拟键值
);

  其中,热键标识id必须是一个范围在0xc000到0xffff之间的全局唯一的值,为了避免可能引起的热键冲突,通常把globaladdatom()返回的原子作为参数传入,而且globaladdatom()返回值的范围同id参数的允许范围是完全一致的。参数fsmodifiers定义了同虚拟键值vk同时按下而产生出系统热键消息wm_hotkey的控制键组合,如mod_alt、mod_control、mod_shift和mod_win等。在本例中将要设定的系统热键为alt+ctrl+r,因此,参数fsmodifiers和vk分别设置为mod_alt mod_control和vk_r。有关系统热键的注册实现方法可以整理如下:

// 获取当前窗口句柄
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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons