动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.C++语言风格流变史.
.Windows下C语言网络编程快速入门.
.C/C++:如何在程序中加载JPG图片?.
.用一维数组存储上三角螺旋矩阵.
.C语言库函数(M类字母).
.利用.NET语言开发自己的脚本语言.
.References and arrays.
.简易实现网上动态信息发布.
.初学者的福音:游戏开发新手入门.
.数据结构学习(C++)之图.
.Windows编程基础 - 设.
.Visual FoxPro 9.0更强大了.
.在C++Builder中使用DLL.
.C语言初学者入门讲座 第七讲 循环.
.根据接受的数字在控制台打印出各.
.几个游戏代码(麻将原代码).
.浅议C++ 中的垃圾回收方法.
.用BCB开发有身份认证功能的Email.
.C编写Windows服务程序的五个步骤.
.贪婪算法---0/1背包问题.

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

发表日期:2008-3-8 |


  摘要: 本文给出了一种通过设置系统热键来呼出在系统后台隐藏运行的服务程序的一种方法,通过这种方法,可以实现后台服务程序在必要的时候同用户的交互设置。   引言   通常情况下,用于后台监控的服务程序(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);
  服务程序的隐藏与激活   服务程序除了被激活后同用户的交互,绝大部分时间都是在后台隐藏运行的,不仅界面是不可视的,而且在任务列表中也不应当出现。关于界面的隐藏比较简单,可以通过向ShowWindow()函数设置SW_HIDE参数来实现,而在任务列表中的隐身则一般的做法是通过调用系统内核Kernel32.DLL的RegisterServiceProcess()函数将其设置成为一个服务进程,这样,在任务列表中也实现了隐身。但是RegisterServiceProcess()函数并非一个标准的API函数,使用起来有点烦琐。首先要通过 GetModuleHandle()函数得到Kernel32.DLL模块的句柄,并由此通过GetProcAddress()函数进一步得出 RegisterServiceProcess()函数在Kernel32.DLL中的入口地址,最后才能使用 RegisterServiceProcess()函数。该函数原型声明如下:
以下是引用片段:
DWORD RegisterServiceProcess(DWORD dwProcessId,DWORD dwType);
  其第一个参数指定了将要注册为服务进程的进程标识,参数dwType指定是去注册一个服务进程(为1时)还是去卸载一个服务进程(为0时)。其具体服务注册过程如下:
  typedef DWORD (WINAPI *RSP)(DWORD dwProcessId,DWORD dwType);
  // 获取Kernel32.DLL模块句柄
  HMODULE m_hKernel = ::GetModuleHandle("Kernel32.DLL");
  // 得到RegisterServiceProcess()函数入口地址
  RSP m_rsp = (RSP)::GetProcAddress(m_hKernel, "RegisterServiceProcess");
  // 注册当前进程为服务进程
  m_rsp(::GetCurrentProcessId(),1);
  在服务程序后台运行期间,一旦有系统热键Alt+Ctrl+R按下,将发出系统热键消息WM_HOTKEY,该消息的消息响应函数不能通过 ClassWizard来添加,而只能手工完成消息映射。在消息响应函数中,通过对消息参数 wParam的判定可以确定出是否是本服务程序所设定的系统热键,假如是,通过ShowWindow(SW_SHOW)将程序界面显示出来,以进行同用户的交互操作:
以下是引用片段:
void CServiceDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
  {
  // 判定是否是本服务程序设置的系统热键
  if (wParam == id)
  {
  ……
  // 在此发送WM_PAINT消息,在OnPain()中通过
  // ShowWindow(SW_SHOW)将界面设置为可视
  PostMessage(WM_PAINT, 0, 0);
  }
  }
  系统热键的卸载   由于前面将系统热键、全局原子等都注册到系统,因此必须在服务程序退出之前将其卸载,否则将导致下次注册时的失败。函数UnregisterHotKey()负责完成对系统热键的释放,GlobalDeleteAtom()将全局原子从全局原子列表删除。   小结   通过本文所述方法为后台运行的系统服务程序添加此热键呼出功能可以真正实现程序的后台隐蔽运行、热键激活,非常有利于治理员和用户的治理与使用。本文所述程序在windows 2000 Professional下,由Microsoft Visual C++ 6.0编译通过。
上一篇:C++中建立对象间消息连接的系统方法 人气:430
下一篇:创世纪的C++ Builder--入门例子 人气:676
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 HDWiki v4.0.1 bulid 081007 UTF
2008-10-7 迅易评选投票管理系统 v10.0
2008-10-7 HDWiki v4.0.1 bulid 081007 GBK
2008-10-7 Bitrac单用户博客 v1.14 bulid 0
2008-10-7 OpenX(广告管理系统) v2.6.2 多国
2008-10-7 乐铺网店系统免费普及版 v3.41
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成