项目中的需求:windows shutdown之前会关闭我们的程序,我要在关机的时候,赶在windows把那个程序(不是我们写的)关掉之前做一些事情。
这篇博客也是对我最近一段工作的一个总结,供日后查看备忘。在这篇blog中,我会提到hook,api拦截,dll注入,还有windows的关机脚本。这篇blog中不会包或具体的实现细节,而且也是想到哪里记录到哪里,可能有些散。恩,准备好了吗?我们开始吧
1. 首先谈一下思路
我们是要在windows关闭掉我们的程序之前做一些事情,显然关机动作是一个api调用,而又众所周知,windows是消息驱动的。所以要想实现我们的目的,我们就必须对下面这两个地方之一下手:
a. 在系统要调用这个api之前。在这个时间点截获他,做我们的动作。这其实就是api拦截
b. 如果该关机api已被执行,我们就必须赶在他把关机消息发给我们要控制的那个程序之前,做我们的操作,这就是hook。
2. hook
我们通常叫他钩子,是的,他又很多种全局钩子,局部钩子,键盘钩子,鼠标钩子等等,当然你也可以钩其他消息,只要你愿意。做钩子其实是做回调函数,可以实现它的语言也很多,我试了C++和C#。当时参考了一本书《Windows程序设计(第2版)》,人邮出的,王艳平著,包括这本书,还有参考到的其他一些书籍后面会有详细的评论。
3. API 拦截
顾名思义,他就是api拦截,思路一般是做一个假的,会让应用程序对指定api的调用,变成对我们的那个假api的调用,而在我们的api中会决定在适当的时机去调用哪个真的api,当然你也可以不去调用哪个真的api。怎么样,是不是有点像我们的proxy模式:)。好了,做api拦截的时候参考的书籍是Jeffrey Richter的《Windows核心编程》。这是一本大名鼎鼎的书,应该不用再多介绍了吧,作者在介绍api拦截的时候介绍了n种实现方案,需要的话可以随时查阅,这里就不细细品味。
4. dll 注入
在看《Windows程序设计(第2版)》中,将dll注入的时候,更加明白了windows底层的一些原理,明白了hook是怎么实现的,也明白了dll注入是api拦截的一种经典实现方案。
5. 关机脚本
这是微软给我们提供的服务,除了关机脚本之外,还有开机脚本,以及登录/注销脚本,98时代没有的东东,感兴趣的朋友可以google一下。他是Windows组策略的一部分。我相信你搜到的文章一定是跟我搜到的文章一样,这些文章中介绍如何编辑组策略的方法多半比较繁琐,其实你直接在运行中输入:gpedit.msc便可以进入编辑关机脚本的界面了。
有一个问题值得一提,当我们添加一个关机脚本的时候系统有两处发生了变化:
a. 注册表如下两处发生了变化
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown]
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System\Scripts\Shutdown]
b. 在[C:\WINDOWS\System32\GroupPolicy\Machine\Scripts]位置下有一个系统隐藏文件:scripts.ini。在这个文件里面微软追加了一项。
我最初用程序生成一个关机脚本的时候就是因为忽视了第二项,导致了失败。后来配置上就好了。ps,我们有找到有命令和api可以注册这个关机脚本,如果大家知道麻烦告诉我,我谢:)
6. 最后:谈谈那两本书
好吧,写在最后谈谈上面提到的那两本书,这应该是最让我high的一部分,呵呵。
a. 《Windows程序设计(第2版)》
,人邮出的,王艳平著。
我读的是他的第一版,借同事的,现在已经有第二版了,我感觉这本书还是十分不错的,难度刚刚好,不很深,又够用。我的观点是读书要读英文经典,但这本书读来感觉不错,第一版chinapub上面还是5星推荐。但是该书的代码示例中确实有导出函数地址的计算不对的错误。遗憾。chinapub的评论中有该书的下载地址,不知道好用否。
b. Jeffrey Richter的《Windows核心编程》
大师的经典著作,我读的是电子版,csdn downlo上有下载,第四版书店里面已经买不到了,第5版马上出来。ps,第五版的中文版是清华出的,同时人邮还出了个影印版。不知道他们在搞什么,还挺同步。我可能是有收藏癖,读过的书都想买,因为我可以在上面做笔记,这样下次再看的时候会方便很多,但是作为java程序员的我,下次需要扣这些的时候会是什么时候,有时间还不如读读,jeffrey richter的CLR via C#。
呵呵,出版社别怕,都买来,我收藏了。
分享到:
相关推荐
本教程将详细讲解如何在Windows下使用Qt来截取并处理系统消息,但需注意的是,通常应当避免处理系统已使用的消息,以防止对系统的正常操作造成干扰。 首先,我们需要理解Qt中的“钩子”(hook)概念。在Windows编程中...
在Windows Mobile操作系统上,短信截取是一个涉及到移动设备安全、数据管理和分析的技术。Windows Mobile是微软为智能手机和平板电脑设计的早期操作系统,虽然现在已经不再主流,但仍有部分企业和个人在使用。短信...
中断关机示例(消息截取)涉及的是操作系统层面的技术,特别是与系统级程序或服务如何干预正常关机、重启、注销流程有关。在Windows系统中,这种技术通常用于开发调试工具或者在特定条件下保持系统运行。 首先,...
在Windows平台上,使用C++进行屏幕截取是一个常见的需求,特别是在开发各种图形用户界面或系统监控工具时。本文将深入探讨如何实现这一功能,包括截取指定区域以及控制鼠标是否显示。 首先,我们需要理解Windows ...
在IT领域,尤其是在Windows系统编程中,"截取程序消息"是一种常见的技术,它涉及到Windows消息机制和钩子(Hook)技术。标题提到的"截取程序消息的DLL"是实现这一技术的一种方法,通常通过创建一个动态链接库(DLL)...
MsgHook,是一个专用于截取windows消息,并交由自定义过程处理的一个控件。 属性 1、HwndHook:MsgHook控件要截取消息的对象的句柄。如果你要为Form1截取消息,那么MsgHook1.HwndHook=Form1.hWnd 2、Message:...
标题中的“截取程序消息的DLL和使用例子GetMSG.rar_windows”表明这是一个关于Windows系统下如何截取并处理程序消息的示例项目。这个压缩包包含了一系列文件,用于创建一个动态链接库(DLL)和一个示例应用程序,...
总的来说,这个压缩包提供了一套完整的解决方案,用于学习和实践如何通过DLL来截取和处理Windows程序消息。通过研究提供的源代码和文档,开发者可以深入了解Windows消息机制,以及如何利用钩子技术来监控和控制应用...
标题和描述中提到的"拦截Windows窗口大小改变消息"以及"拦截窗口最大化,最小化事件",主要涉及Windows API中的消息机制。在Windows编程中,窗口与用户交互时会产生各种消息,如WM_SIZE(窗口大小改变),WM_...
### MFC截取按键消息详解 #### 一、概述 MFC(Microsoft Foundation Classes)是微软提供的一套基于Win32 API的类库,用于简化Windows应用程序开发过程中的复杂度。在MFC中,对话框是非常重要的组成部分之一,用于...
在Windows操作系统中,用户通常可以通过按下键盘上的`PrintScreen`(或`PrtScn`、`Prt Scr`)键来捕获整个屏幕的图像。然而,通过编程方式实现这一功能可以提供更多的定制化选项和自动化能力。本篇将详细讲解如何...
在Windows操作系统中,开发一个能够定时截取用户桌面并将其发送至指定邮箱的服务是一个实用的功能,尤其对于远程监控、故障排查或数据记录等场景。这个功能涉及到多个技术领域,包括Windows服务编程、屏幕截图、电子...
当涉及到串口的深度监控和截取时,通常需要深入到Windows内核层进行编程,这是一项高级且复杂的技术。本文将探讨如何使用Delphi进行Windows内核编程,以实现串口数据的监控和截取。 一、Delphi与串口编程 Delphi...
批处理脚本是一种Windows环境下的脚本语言,它能够执行一系列预先编写的命令来实现特定的功能。本文将详细介绍如何在批处理脚本中进行字符串截取,并通过具体的例子来说明不同的截取方法。 ### 一、基本概念 在...
3. `OnDraw(CDC* pDC)`: 这是MFC绘图机制的一部分,`CCapture`类可能重载这个函数,以便在需要时将截取的位图绘制到设备上下文`pDC`上。 在实现这些功能时,我们还需要考虑一些细节: - 图像的保存:除了截取和...
本文详细描述以下过程,都是亲自验证过有效的,Windows 上安装 FFmpeg 程序,实现视频转码,截取,合并视频,比如截取 10 秒的视频,还可调整播放速度, 还可从 mp4 文件中提取出 MP3 音频,去掉视频里的声音(静音...
C#是一种广泛使用的面向对象的编程语言,由微软公司开发,特别适合Windows平台的应用程序开发。在C#中,处理二进制文件主要依赖于`System.IO`命名空间下的类,如`FileStream`、`BinaryReader`和`BinaryWriter`。`...
要截取这些消息,我们需要创建一个Windows消息过滤器,这通常通过重写WinForm或WPF应用程序的WndProc方法实现。WndProc方法是Windows窗口过程,它接收并处理所有发送到窗口的消息。 在C#中,对于WinForm应用,你...
本文档将详细介绍与Windows消息处理相关的基础知识,包括如何通过Visual C++ (VC++) 和 Visual Studio 2005 (VS2005) 直接赋值给诸如`WM_CHAR`等消息,以及如何截取这些系统消息,特别是针对那些不知道消息的十六...
在Windows操作系统上,用户只需双击此文件,就可以启动程序并开始截取PDF页面。 2. 步骤.mht:这是一个MHTML(多用途互联网邮件扩展)文件,通常用于存储网页内容。在这个场景中,它可能包含了使用PDFApp截取工具的...