用一个低优先级的线程轮询SystemParameterInfo(SPI_GETSCREENSAVERRUNNING...)。另,当系统激活屏保时,你的程序会收到WM_SYSCOMMAND(wParam=SC_SCREENSAVE)。

解决方案 »

  1.   

    用一个低优先级的线程轮询SystemParameterInfo(SPI_GETSCREENSAVERRUNNING...)直到FALSE,即屏保退出。
      

  2.   

    如何在 VC程序中关闭屏保呢?
    我试了用SystemParameterInfo好象不行,请高手指教!
      

  3.   

    给你一个用Delphi写个小例子:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        procedure WMSysCommand(var msg: TWMSysCommand); message WM_SYSCOMMAND;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}type  TWaitThread = class(TThread)
      public
        procedure Execute; override;
      end;{ TWaitThread }procedure TWaitThread.Execute;
    var
      Running: boolean;
    begin
      FreeOnTerminate:=true;
      while not Terminated do
      begin
        SystemParametersInfo(SPI_GETSCREENSAVERRUNNING,0,@Running,0);
        Sleep(5);  // watch your CPU without this!  
        if not Running then Terminate;
      end;
    end;procedure TForm1.WMSysCommand(var msg: TWMSysCommand);
    begin
      inherited;
      if msg.CmdType = SC_SCREENSAVE then // screensaver will now running
      begin
        Windows.Beep(1000,200);
        TWaitThread.Create(false).WaitFor; // return when screensaver exit
        Windows.Beep(5000,200); 
        msg.Result:=0; 
      end;
    end;
      

  4.   

    JGTM2000:
     您知道如何编程实现关掉需要口令的屏保吗?
      

  5.   

    JGTM2000:若方便的话,请写段VC吧,
    当然,有所付出,就有所得。
      

  6.   

    UINT MyControllingFunction( LPVOID pParam ){
      BOOL Running = TRUE;
      while(Running){
        Sleep(5);
        ::SystemParameterInfo(SPI_GETSCREENSAVERRUNNING,0,&Running,0);
      }
      return 0;
    }CWinThread *waitThread = AfxBeginThread(MyControllingFunction,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
    WaitForSingleObject(waitThread->m_hThread,INFINITE);在你的主线程中通过WaitForSingleObject等待waitThread监测屏保的运行状态。当线程开始的时候应该确保屏保已经运行,可以通过映射WM_SYSCOMMAND消息处理函数判别SC_SCREENSAVE标志来获知屏保开始运行。