VC实现系统热键激活后台服务程式[1]

2008-02-23 05:39:39来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  摘要: 本文给出了一种通过配置系统热键来呼出在系统后台隐藏运行的服务程式的一种方法,通过这种方法,能够实现后台服务程式在必要的时候同用户的交互配置。

  引言

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

[1] [2]




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C#写的ADSL拨号程式示例

下一篇: C语言面试题大汇总之华为面试题

热门词条
热门标签