如何获取锁定计算机事件

ly_chn 2007-05-16 09:51:28
当用户手动锁定计算机(按Ctrl+Alt+Del然后锁定计算机)或者其他程序锁定计算机时,获取此消息,我已经知道在WindowsXP下可以使用WTSRegisterSessionNotification(m_hWnd, NOTIFY_FOR_ALL_SESSIONS);通知注册消息的方法可以获得锁定计算机方法,不过这种方法在Windows 2000下不能用。

想知道,在Windows 2000有什么方法能够获得锁定计算机的消息
...全文
906 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly_chn 2007-05-17
  • 打赏
  • 举报
回复
感谢tongtong3610

按照你们提供的方法试了,在XP下很正常,但在2000下有的机器可以,有的却不行,怎么搞的?
tongtong3610 2007-05-16
  • 打赏
  • 举报
回复
新建一个dll工程,如pislockdlltest,添加获取锁屏事件后,相应函数,如pislock()
void pislock()
{
MessageBox(NULL,"lock","锁屏通知",MB_OK);
}
并将此函数导出pislock函数
将生成的dll放到system32下
修改注册表 在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify”下创建你的子键如 pislock

创建如下键值:

Asynchronous[REG_DWORD]:表明是否异步处理winlogon事件,如设为 1,winlogon将启动一个新线程来处理。
DllName[REG_EXPAND_SZ]:指定要加载的DLL名。如pislockdlltest
Impersonate[REG_DWORD]:表明是否以登陆用户的权限来处理事件。默认值0
Lock[REG_SZ]:锁定桌面事件。函数名 如pislock
重启计算机,即可

ly_chn 2007-05-16
  • 打赏
  • 举报
回复
回复的慢了点,没刷新

看见代码了,我研究一下,非常感谢
kugou123 2007-05-16
  • 打赏
  • 举报
回复
其实就是做个DLL,系统检测到锁定事件的时候,调用你DLL对应的函数去处理而已。
kugou123 2007-05-16
  • 打赏
  • 举报
回复
你看看代码,自己试试吧
ly_chn 2007-05-16
  • 打赏
  • 举报
回复
感谢 kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)

关于Winlogon通知包,能说的详细一点吗,我不十分了解。

其他朋友有类似使用的能给点建议吗?
kugou123 2007-05-16
  • 打赏
  • 举报
回复
“Winlogon通知包(Winlogon Notification Package)”就是处理winlogon在切换状态时发出的事件的DLL。你可以通过“Winlogon Notification Package”来监视winlogon事件的响应。你可以注册这些DLL,那么winlogon.exe会在启动时加载它们,并且会在系统状态切换时来调用注册DLL的事件处理函数。

为了注册你的“Winlogon Notification Package”,必须在“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify”下创建你的“notification package”子键。在我的系统中,存在6个子键,分别是:crypt32chain,cryptnet,cscdll,sclgntfy,SensLogn,termsrv。在“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便调用相应的函数。

Lock[REG_SZ]:锁定桌面事件 是你需要关注的事件。你需要添加这个键值,并指定处理的函数。

譬如:DllName的值为“test.dll”,Lock的值为“testLock”,那么系统注销时winlogon.exe将调用test.dll中导出的“testLock”函数。

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

//----------------------------------Start of WNP.C-------------------------------------------
/*Create file exports.def with content:
EXPORTS
testlogoff
*/
#include <windows.h>
#pragma comment(linker,"/export:test=_testLock@0")
#pragma comment(linker,"/entry:DllEntry")
#pragma comment(linker,"/subsystem:windows")
#pragma comment(linker,"/align:4096")
#pragma comment(linker,"/dll")
#pragma comment(linker,"/base:1976369152")

__declspec(dllexport) void __stdcall testLock(DWORD unknow)
{
MessageBox(NULL,"系统锁定!","Winlogon Notification Package",MB_OK);
}

BOOL __stdcall DllEntry(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:break;
case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;
case DLL_PROCESS_DETACH:break;
}return TRUE;
}
//----------------------------------End of WNP.C---------------------------------------------

将编译好的test.dll复制到系统文件夹,修改注册表并重启后,发现C:\WINNT\system32\test.dll已经成功加载到winlogon.exe进程中。
ky310 2007-05-16
  • 打赏
  • 举报
回复
不懂,支持一下
kugou123 2007-05-16
  • 打赏
  • 举报
回复
要获取用户锁定桌面的事件,可以使用Winlogon通知包编程方式实现。
ly_chn 2007-05-16
  • 打赏
  • 举报
回复
感谢 miaoshengwu(孤单北半球)

我知道如何通过程序锁定计算机,我想知道的是怎么能检测到用户锁定计算机了,说白了就是我写了个小程序,想在用户锁定计算机以后自己暂停运行,等用户回来以后继续。

有知道相关方法给说一下哈。
miaoshengwu 2007-05-16
  • 打赏
  • 举报
回复
试试下面这个,XP里用过,2000下没用过,
HMODULE hUser32dll;
PROC MyLockWorkStation;

hUser32dll=GetModuleHandle("user32.dll");
MyLockWorkStation=GetProcAddress(hUser32dll,"LockWorkStation");
if(MyLockWorkStation)
MyLockWorkStation();

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧