WinLogon事件通知包编程

2007年5月18日,21:18:55| yexiaozhou2003[AT]hotmail.com(cooldog)

今天看到CSDN中有网友问道如何获取用户按Ctrl+Alt+Del锁定桌面的事件。回帖后大致整理了一下,希望对大家有帮助。
首先我们要了解一下WinLogon,他是负责提供给用户交互式界面的一个程序。

WinLogon初始化时会创建3个桌面:
(1)、winlogon桌面:主要显示window 安全等界面,如你按下CTRL+ALT+DEL,登陆的界面等
(2)、应用程序桌面:我们平时见到的那个有我的电脑的界面(这个大家都见过了吧,呵呵)
(3)、屏幕保护桌面:屏幕保护显示界面。

到这里,仿佛我们找到了方法,就是编写Hook程序,截获CTRL+ALT+DEL,按下的消息,这样不就可以判断用户是否要锁定桌面了吗?其实不然,在WinLogon初始化时,就向系统注册截获CTRL+ALT+DEL消息,所以其他程序就无法得到CTRL+ALT+DEL的消息。
WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供的接口,自己可以编GINA DLL来代替MSGINA.DLL。

到这里,我们还能想到的方法,就是采用建立远程线程的方式,注入到WinLogon.exe中,这样也可以截获到Ctrl+Alt+Del的按下的事件。不过写远程线程比较麻烦,而且调试起来也不方便。

其实WinLogin还为我们提供了另外一种方式,就是WinLogin通知包的方式。

Winlogon通知包(Winlogon Notification Package)”就是处理winlogon在切换状态时发出的事件的DLL。你可以通过“Winlogon Notification Package”来监视winlogon事件的响应。你可以注册这些DLL,那么winlogon.exe会在启动时加载它们,并且会在系统状态切换时来调用注册DLL的事件处理函数。

其实说简单一点,就是我们可以自己编写处理winlogon的事件的逻辑,将其作为函数导出,把它编译为Win32 Dll,然后添加信息到注册表。接下来的工作,我们就不用操心了,Winlogon会根据不同的事件,自己来调用我们DLL提供的函数进行处理。

为了注册你的“Winlogon Notification Package”,必须在“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify”下创建你的“notification package”子键。在“Notify”项下,可以根据需要创建如下键值:

Asynchronous[REG_DWORD]:表明是否异步处理winlogon事件,如设为 1,winlogon将启动一个新线程来处理。
DllName[REG_EXPAND_SZ]:指定要加载的DLL名。
Impersonate[REG_DWORD]:表明是否以登陆用户的权限来处理事件。
Lock[REG_SZ]:锁定桌面事件。
Logoff[REG_SZ]:注销事件。
Logon[REG_SZ]:登陆事件。
Shutdown[REG_SZ]:关机事件。
StartScreenSaver[REG_SZ]:启动屏保事件。
StartShell[REG_SZ]:启动shell(一般指explorer.exe)事件。
Startup[REG_SZ]:系统开机事件。
StopScreenSaver[REG_SZ]:停止屏保事件。
Unlock[REG_SZ]:解除桌面锁定事件。

其中每个事件对应DLL中的一个导出函数,即每当有事件发生时,winlogon.exe便调用相应的函数。
譬如:DllName的值为“test.dll”,Lock的值为“testLock”,那么系统锁定时,winlogon.exe将调用test.dll中导出的“testLock”函数。

关于DLL的实现非常地简单:只要导出处理事件是要调用的函数就行,其他和别的DLL无异。以下是代码的简单实现:

// WinLogonNotify.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "WinLogonNotify.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
      )
{
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
 case DLL_THREAD_ATTACH:
 case DLL_THREAD_DETACH:
 case DLL_PROCESS_DETACH:
  break;
 }
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif


// This is an example of an exported function.
WINLOGONNOTIFY_API void _stdcall testLock(DWORD param)
{
 MessageBox(NULL,L"Lock!",L"Tips",MB_OK);
 return;
}

以上代码在Visual Studio 2005 开发平台上编译通过。

大家可以大包下载代码参考。

点击下载此文件

这个帖子的源地址如下:

标题:如何获取锁定计算机事件
http://community.csdn.net/Expert/topic/5536/5536030.xml?temp=6.365603E-02

转载于:https://www.cnblogs.com/MaxWoods/archive/2008/06/13/1219892.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bat函数调用 带返回值

bat 脚本之 使用函数 摘自:https://blog.csdn.net/peng_cao/article/details/73999076 综述bat函数写法bat函数调用bat函数返回值综述 Windows bat脚本是一种解释性的脚本语言,可以拿到做很多事情。对于稍简单的问题:比如通过注册表判断下档期…

配置 jvisualvm 监控Java虚拟机

配置JMX远程连接 1. 配置启动参数 启动jar时,添加如下配置-Dcom.sun.management.jmxremote.port5050 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse -Djava.rmi.server.hostname192.168.94.23 启动参数说明 -Dcom.sun…

所有排序算法

---恢复内容开始--- 先看看复杂度大小吧 冒泡排序 直接上代码,? # 冒泡排序def bubble_sort(alist): for j in range(len(alist) - 1, 0, -1): for i in range(j): if alist[i] > alist[i 1]: alist[i], alist[i 1] ali…

亲身经历之微信支付沙箱环境扫码支付遇到的那些坑

很多用户在调用微信支付扫码支付沙箱环境都一脸迷茫,废话不多说,遇到很多坑,为了让大家少走弯路下面直接说说我开发微信支付遇到坑,微信沙箱不是一般的坑,是很大的坑。 1.首先下载的官方demo,不能直接用,里…

Microsoft .NET Pet Shop 4.0 学习之旅(二) - 项目的引用关系1

Microsoft .NET Pet Shop 4.0 学习之旅&#xff08;二&#xff09; 项目的引用关系1 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />初看到Pet Shop 4.0的源代码觉得结构很复杂&#xff0c;今天我只讨论业务逻辑层&#xff08;…

vs.net各版本解决方案相互转换工具

感谢Arthur Liberman, 感谢zu14.cn三角猫 工具下载转载于:https://www.cnblogs.com/JoinZhang/archive/2010/07/09/1774617.html

杂谈杂想!

a) 在Live Write 实施插入地图 b) 金山词霸为什么总是把“音乐(YUE)”念成“音乐&#xff08;LE&#xff09;”&#xff1f;这个bug好多年&#xff01; c) 养的基瘦了&#xff0c;人却变胖了&#xff01; 转载于:https://www.cnblogs.com/jeffersyuan/archive/2007/11/10/95528…

链接Mysql的api mysqli和pdo

HP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved)PDO (PHP Data Objects)PDO 应用在 12 种不同数据库中&#xff0c; MySQLi 只针对 MySQL 数据库。 如果你的项目需要在多种数据库中切换&#xff0c;建议使用 PDO 两者都是面向对…

Vue项目中自动将px转换为rem

一、配置与安装步骤&#xff1a; 1、在 Vue 项目的 src 文件夹下创建一个 config 文件夹&#xff1a; 2、在 config 文件夹中创建 rem.js&#xff1a; 3、将以下代码复制到 rem.js 中&#xff1a; // 基准大小 const baseSize 32 // 设置 rem 函数 function setRem () {// 当前…

MySQL8.0.19下载安装及配置详细步骤

下载&#xff1a; 软件下载地址&#xff1a;https://www.mysql.com/downloads/ 进入主页后下滑见 然后点击下图的MySQL Community Server 进入之后&#xff0c;点击Download进行下载 进入Download之后&#xff0c;点击No thanks, just start my download&#xff08;无需注…

解决[ERROR] [MY-013276] [Server] Failed to set datadir to ‘F:\Mysql\mysql-8.0.19-winx64\data\‘ (OS er

解决[ERROR] [MY-013276] [Server] Failed to set datadir to ‘F:\Mysql\mysql-8.0.19-winx64\data’ (OS errno: 2 - No such file or directory)报错问题 输入&#xff1a;mysqld --initialize --usermysql --console 如下图&#xff1a; 然后输入mysqld -install&#xff…

DataTable操作相关实例

代码 publicDataSet GetChildDepartmentsByUserId(Guid userId) { DataSet ds newDataSet(); try{ OrgChartDB.OrgChart_PermissionDataTable pdt permissionTableAdapter.GetDataByUserId(userId); for(inti 0; …

修改mysql密码时遇见ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that correspo

修改mysql密码时遇见ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘password(‘123456’)’ at line 1报错 如下图&#xff1a; 这个句子翻译过来的意思是…

JavaScript基础内容

1.1 JavaScript基础概念&#xff1a; JavaScript (ECMAScript) &#xff1a;JavaScript 是脚本语言。JavaScript和ECMAScript通常被人用来表达相同的含义&#xff0c;但是JavaScript并不是这么一点含义&#xff0c;它是由ECMAScript 核心. DOM 文档对象模型. BOM 浏览器对象模型…

如何利用navicat可视化软件添加与新建mysql数据库

新建 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 打开navicat,如下图&#xff1a; 点击连接 名称可以…

mysql -- 死锁

死锁&#xff08;Deadlock&#xff09; 什么是死锁 所谓死锁&#xff1a;是指两个或两个以上的进程在执行过程中&#xff0c;因争夺资源而造成的一种互相等待的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁&#xf…

在windows下的cmd中如何进入与退出mysql

在windows下的cmd中如何进入与退出mysql https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 进入&#xff1a;…

在shell中全局变量与局部变量的区别及其举例

主要区别&#xff1a; 1.作用域不同&#xff1a;全局变量的作用域为整个程序&#xff0c;它的声明在后面的各个部分都可以发生作用&#xff0c;而局部变量仅仅为定义的某个函数。且局部变量只能在局部进行使用。 2.优先级不同&#xff1a;局部变量优先于全局变量。 3.生命周期…

黑盒测试概念简述,黑盒测试优缺点、黑盒用例设计方法简单介绍及黑盒测试方法使用总结

黑色测试黑盒测试概念&#xff1a;黑盒的优缺点介绍&#xff1a;黑盒测试用例设计方法简单介绍&#xff1a;黑盒测试方法使用总结&#xff1a;黑盒测试概念&#xff1a; 又称功能测试或数据驱动测试&#xff0c;是用来检测每个功能是否正常使用。黑盒测试主要意味着测试要在软…

超文本css样式换行

之前有关于LODOP中纯文本换行的相关博文&#xff1a;Lodop纯文本英文-等符号自动换行问题纯文本的遇到不拆分的单词的时候&#xff0c;可以通过LODOP 语句设置允许标点溢出&#xff0c;且英文单词拆开。超文本需要通过css样式控制&#xff0c;相关博文&#xff1a;Lodop打印控件…