经常下班关机忘了打卡,想写一个钩子程序捕获Windows关机事件,查资料说使用钩子处理WM_QUERYENDSESSION消息,但是总不能捕获正常的关机,有人知道解决办法吗?

解决方案 »

  1.   

    你在程序中直接响应
    WM_QUERYENDSESSIONLRESULT CturnOffDetectorDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
        // TODO: Add your specialized code here and/or call the base class
        if (WM_QUERYENDSESSION == message)  // 关机,注销;怎样区分查看msdn  WM_QUERYENDSESSION 
        {
            AfxMessageBox(_T("...."));
            return FALSE; //阻止
        }    return CDialog::WindowProc(message, wParam, lParam);
    }但是如果某个程序通过 ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);的方式强制关机,系统就不会发出WM_QUERYENDSESSION消息,当然也就拦截不倒了~
      

  2.   

    System Shutdown Messages
    The following messages are used with system shutdown. 
    WM_ENDSESSION
    WM_QUERYENDSESSION 
    WM_QUERYENDSESSION:
    LPARAM lParam,If this parameter includes the ENDSESSION_LOGOFF value, the user if logging off. 
      

  3.   

    在程序中处理WM_QUERYENDSESSION消息,返回0即可,代码参考2楼
      

  4.   

    用WH_GETMESSAGE  HOOK,消息内容存在lParam 指向的MSG结构体中
    根据消息进行操作
      

  5.   

    hook ExitWindowsEx肯定可以的,如果突然掉电,或者强行按Power键就。
      

  6.   


    如果突然掉电,肯定会再开机的,
    强行按Power键,那是自己找死拉。。
      

  7.   

    如果仅仅实现关机时提醒打卡,就是WM_QUERYENDSESSION吧?