现在可以获取到休眠和系统唤醒的消息,但是如何获取windows登陆的消息呢
就是在唤起时会先进入到开始的用户选择界面,这个时候选择用户后才进入桌面,
我现在就是想知道如何获取到从 用户选择界面->桌面 这个过程的消息。以便我程序中做一些处理。
谢谢
就是在唤起时会先进入到开始的用户选择界面,这个时候选择用户后才进入桌面,
我现在就是想知道如何获取到从 用户选择界面->桌面 这个过程的消息。以便我程序中做一些处理。
谢谢
解决方案 »
- GetUpdateRect(hWnd, NULL, FALSE)函数执行总是NULL,error look up 查看返回数值6.
- 如何让机器A上的程序A1调用机器B上的程序B1
- xl5338870(xlix) 给你100,非常感谢
- 在一个ListView中创建一个对话框类的全局变量,可以吗?为什么运行时会报错?
- 关于控件的问题,请教高手:)
- 用ado连access问题,那位大哥指点一二,小弟有礼了。
- 请教一个串口读写的问题
- 动态链接库里面的
- 我的CString 变量的长度被截短了!
- 灾难性故障VS2017
- vc++ 6.0编译出错
- #pragma comment( lib, "winmm.lib" )谢谢高手帮我讲解下这个
windows在NT 以上的系统已经用notify机制
最近写东西的时候,需要加上监控主机开机启动登录注销等信息,
解决的方法很多,比如Hook nt!NtExitWindowEx,拦截WM_ENDSESSION消息(部分)
其实,windows在NT4以上的平台已经引入了这种Notify机制,要监控主机开机启动登录注销等信息,只需向系统注册即可,
//启动监视
BOOL MyInstallDemon()
{
//注册表路径
const WCHAR szDemonRegPath[70]=_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\MyDemon");
//相关监视函数名
const int MAX_DEMON_FUNCTION_LENGTH=30;
const WCHAR szLockFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonLock"); //锁定
const WCHAR szUnlockFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonUnlock"); //解锁
const WCHAR szLogonFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonLogon"); //登陆
const WCHAR szLogoffFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonLogoff"); //注销
const WCHAR szStartupFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonStartup"); //开机
const WCHAR szShutdownFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonShutdown"); //关机
const WCHAR szStartScreenSaverFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonStartScreenSaver"); //启动屏保
const WCHAR szStopScreenSaverFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonStopScreenSaver"); //关闭屏保HKEY hDemonKey=NULL;
BOOL bReturnFlag=TRUE;
LONG lResultFlag=0;
DWORD Resvered=0;
LPTSTR lpclass=NULL;
DWORD dwOptions=REG_OPTION_NON_VOLATILE;
REGSAM samDesired=KEY_WRITE;
SECURITY_ATTRIBUTES SA;
SA.bInheritHandle=true;
SA.nLength=sizeof(SECURITY_ATTRIBUTES);
SA.lpSecurityDescriptor=NULL;
DWORD dwDisposition=REG_CREATED_NEW_KEY&®_OPENED_EXISTING_KEY;
lResultFlag=RegCreateKeyExW(HKEY_LOCAL_MACHINE,szDemonRegPath,Resvered,lpclass,dwOptions,\
samDesired,&SA,&hDemonKey,&dwDisposition);
if (ERROR_SUCCESS != lResultFlag)
{
if (NULL!=hDemonKey)
{
bReturnFlag=FALSE;
}
}
else
{
WCHAR szDemonDllPath[13]=_T("DemonDll.dll");
//设定异步- winlogon将使用新线程
DWORD dwAsynFlag=1;
lResultFlag=RegSetValueExW(hDemonKey,_T("Asynchronous"),0,REG_DWORD,(LPBYTE)&dwAsynFlag,sizeof(dwAsynFlag));
if (ERROR_SUCCESS != lResultFlag)
{
bReturnFlag=FALSE;
}
//设定dll的路径
lResultFlag=RegSetValueExW(hDemonKey,_T("DllName"),0,REG_EXPAND_SZ,(LPBYTE)szDemonDllPath,sizeof(szDemonDllPath));
if (ERROR_SUCCESS != lResultFlag)
{
bReturnFlag=FALSE;
}
//锁定
lResultFlag=RegSetValueExW(hDemonKey,_T("Lock"),0,REG_SZ,(LPBYTE)szLockFunction,sizeof(szLockFunction));
if (ERROR_SUCCESS != lResultFlag)
{
bReturnFlag=FALSE;
}
//解锁
lResultFlag=RegSetValueExW(hDemonKey,_T("Unlock"),0,REG_SZ,(LPBYTE)szUnlockFunction,sizeof(szUnlockFunction));
if (ERROR_SUCCESS != lResultFlag)
{
bReturnFlag=FALSE;
}
//登陆
lResultFlag=RegSetValueExW(hDemonKey,_T("Logon"),0,REG_SZ,(LPBYTE)szLogonFunction,sizeof(szLogonFunction));
if (ERROR_SUCCESS != lResultFlag)
{
bReturnFlag=FALSE;
}
//注销
lResultFlag=RegSetValueExW(hDemonKey,_T("Logoff"),0,REG_SZ,(LPBYTE)szLogoffFunction,sizeof(szLogoffFunction));
if (ERROR_SUCCESS != lResultFlag)
{
bReturnFlag=FALSE;
}
winlogon本身的接口就是要你写一个dll,然后注册到HKLM\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify下
附近的几句的意思是不是:这些是指定的dll的导出函数的函数名?
如: DemonLock 说明有一个 void DemonLock(void); 函数
(这些函数没有参数?)PS 确定只能使用 __cdecl 调用约定?