我想在程序里定时结束系统的屏幕保护,请问应该怎么做?

解决方案 »

  1.   


    W2k中如何终止屏幕保护(hangwire发表于2001-11-17 9:30:59) [问题]:
    我编写了一个报警程序,功能是当我的报警程序接到报警消息时,必须终止屏幕保护程序或者节能模式并显示报警消息,或者在屏幕保护程序之上显示报警消息也可以。我用SetWindowPos(&wndTopMost…)试过不灵,在W2k的屏保中也没有成功。我的程序想在W2k里运行,如何在特定的事件发生时终止屏幕保护?[解答]:
    在Windows 9x中,终止屏幕保护的方法很简单,获取活动窗口指针,然后发送WM_CLOSE消息即可:
    PostMessage(GetActiveWindow(),WM_CLOSE,0,0);
    但是,在W2k中这个方法就不灵了,W2k的桌面概念与以往不同,其屏幕保护是运行在专门的桌面当中,这个桌面叫做"Screen-saver"。你用GetActiveWindow 或者 GetForegroundWindow函数是找不到屏幕保护窗口的,因为它运行在另外的桌面里。要获得屏保窗口,你必须打开这个专门的桌面,列举其中的所有窗口,判断窗口是不是屏幕保护窗口,如果保护窗口可见,则发送WM_CLOSE消息。详细代码如下(或者参见MSDN KB 文章Q140723):
    BOOL CALLBACK KillScreenSaverFunc(HWND hwnd, LPARAM lParam)
    {
       if(IsWindowVisible(hwnd))
          PostMessage(hwnd, WM_CLOSE, 0, 0);
       return TRUE;
    }
    // 打开屏保专用桌面"Screen-saver"
    //
    HDESK hdesk = OpenDesktop(TEXT("Screen-saver"),
       0,                                   // flags
       FALSE,                               // new processes inherit handle?
       DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); // access/////////////////
    // 用专门的"close"函数列举窗口并关闭桌面。
    //
    if (hdesk) {
       EnumDesktopWindows(hdesk, KillScreenSaverFunc, 0);
       CloseDesktop(hdesk);

      

  2.   

    模拟键盘 用Keybd_event
    模拟鼠标按键用mouse_event函数
      

  3.   

    以下是禁用屏幕保护的代码:
    void DisableScrSaver()
    {
     BOOL bScrActive; 
     SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bScrActive, 0);
     if (bScrActive)
     {
      SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
     } 
    }
    以下是启用屏幕保护的代码:
    void CNetRGCltDlg::EnableScrSaver()
    {
     SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
    }