Windows在启动屏幕保护程序前会向当前激活的应用程序发WM_SYSCOMMAND消息。
当是如果当前应用程序没有激活,能用什么办法截获WM_SYSCOMMAND的消息?void CGgDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
   if((nID == SC_SCREENSAVE || nID == SC_MONITORPOWER)) 
      { return; }
   else CDialog::OnSysCommand(nID, lParam);
 }这段程序只有在该窗口激活的状态下才能截取SC_SCREENSAVE和SC_MONITORPOWER消息,进而阻止系统进入屏保和待机。
而我希望在该应用程序(已经运行开来的了)没有激活的状态下,截取系统的屏保和待机消息~
比方说我把应用程序最小化了,还能阻止屏保和待机……
希望大家帮忙指点,能提供详细的代码更好。谢谢

解决方案 »

  1.   

    ::SetWindowsHookEx(WH_GETMESSAGE,...);
      

  2.   

    http://topic.csdn.net/u/20100129/14/d50b04f9-856c-4493-998b-8a6555ecf8d5.html
      

  3.   

    在这个函数LRESULT CGgDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)中:
    if(message == WM_POWERBROADCAST && wParam == PBT_APMQUERYSUSPEND)用来截取待机的消息,进而操作是否阻止等功能,如果return BROADCAST_QUERY_DENY;就阻止系统进入待机。if(message == WM_POWERBROADCAST && wParam == PBT_APMRESUMEAUTOMATIC)用来截取待机激活的消息,进而操作待机激活后是否充电或其他功能。那么对于截取屏保消息和退出屏保的消息,应该怎么做?
    还有关于PBT_APMxxxxxxxx等消息跟SC_MONITORPOWER等消息有什么区别?
    最后进入待机后,用鼠标和键盘激活怎么做,是用钩子函数完成的吗?还是有其他方法?请大家帮忙指点迷津,互相学习。希望能提供详细的代码和注释,感激不尽!!
      

  4.   

    只是阻止的话可以用 SetThreadExecutionState