手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

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

  引言

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




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS