VC实现系统热键激活后台服务程式[2]
2008-02-23 05:39:38来源:互联网 阅读 ()
服务程式除了被激活后同用户的交互,绝大部分时间都是在后台隐藏运行的,不但界面是不可视的,而且在任务列表中也不应当出现。关于界面的隐藏比较简单,能够通过向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); |
服务程式的隐藏和激活
服务程式除了被激活后同用户的交互,绝大部分时间都是在后台隐藏运行的,不但界面是不可视的,而且在任务列表中也不应当出现。关于界面的隐藏比较简单,能够通过向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); |
以下是引用片段: 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编译通过。
[1] [2]
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 使用C 异常来取代exit()函数[2]
下一篇: C 语言最大难点揭秘[1]
- VC实现系统热键激活后台服务程式[1] 2008-02-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash