日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WinLogon事件通知包编程

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WinLogon事件通知包编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2007年5月18日,21:18:55| yexiaozhou2003[AT]hotmail.com(cooldog)

今天看到CSDN中有網友問道如何獲取用戶按Ctrl+Alt+Del鎖定桌面的事件?;靥蟠笾抡砹艘幌?#xff0c;希望對大家有幫助。
首先我們要了解一下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

總結

以上是生活随笔為你收集整理的WinLogon事件通知包编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。