网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> VC编程 >> 文章正文
  VC实现系统热键激活后台服务程序            【字体:
VC实现系统热键激活后台服务程序
作者:佚名    文章来源:不详    点击数:    更新时间:2007-7-31    


  摘要: 本文给出了一种通过设置系统热键来呼出在系统后台隐藏运行的服务程序的一种方法,通过这种方法,可以实现后台服务程序在必要的时候同用户的交互设置。
正在装载数据……


  引言

  通常情况下,用于后台监控的服务程序(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);

站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     directx 图形接口指南(…
     win2k下的api函数的拦截
     用crypto  api  实现公钥…
     根据别人的md5源码封装的…
     vc中使用gdi+合并jpg图片
     document/view的交互 --…
     windows下的函数hook技术
     windows api函数大全一
     用vc 6.0实现串行通信的…
     vc++技术内幕(第四版)…
  • Java Swing实现俄罗斯方块

  • 在spring MVC中配置多个视图

  • GC实现

  • 基于对称延拓的小波变换算法…

  • OpenCV在VC.net,VC6.0等中的…

  • VC++消息映射

  • 共合网被评为2006-2007最受V…

  • 安装 VC++ 重启

  • VC/MFC.CString操作指南

  • 一些vc的基本知识,创建应用实…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David