现在可以获取到休眠和系统唤醒的消息,但是如何获取windows登陆的消息呢
就是在唤起时会先进入到开始的用户选择界面,这个时候选择用户后才进入桌面,
我现在就是想知道如何获取到从 用户选择界面->桌面 这个过程的消息。以便我程序中做一些处理。
谢谢

解决方案 »

  1.   

    http://hi.baidu.com/cdutboy/blog/item/e74f9cfbfb3f8f829f514623.html
    windows在NT 以上的系统已经用notify机制
    最近写东西的时候,需要加上监控主机开机启动登录注销等信息,
    解决的方法很多,比如Hook nt!NtExitWindowEx,拦截WM_ENDSESSION消息(部分)
    其实,windows在NT4以上的平台已经引入了这种Notify机制,要监控主机开机启动登录注销等信息,只需向系统注册即可,
      

  2.   

    这里贴出代码,供需要的同学参考
    //启动监视
    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&&REG_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;
    }
      

  3.   

    看看gina吧,这个是windows管理登陆的
      

  4.   


    winlogon本身的接口就是要你写一个dll,然后注册到HKLM\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify下
      

  5.   

    const WCHAR szLockFunction[MAX_DEMON_FUNCTION_LENGTH]=_T("DemonLock"); //锁定
    附近的几句的意思是不是:这些是指定的dll的导出函数的函数名?
    如: DemonLock  说明有一个 void DemonLock(void); 函数
    (这些函数没有参数?)PS 确定只能使用 __cdecl 调用约定?