用一个低优先级的线程轮询SystemParameterInfo(SPI_GETSCREENSAVERRUNNING...)。另,当系统激活屏保时,你的程序会收到WM_SYSCOMMAND(wParam=SC_SCREENSAVE)。
解决方案 »
- MFC DLL中创建非模态子对话框,主窗口退出是出现异常
- 概要屏幕划分的模式的问题
- 曲线滚动的问题
- 我编写了一个activex控件,如何在繁体版的windows操作系统中显示文字?
- guilib(guitoolkit) 如何使用它的静态库?有高手实现过吗?
- 求助,一个连接串口的通讯模块与掌上电脑通讯的程序。
- 关于RELEASE版本的优化问题!
- 求一段利用winsocket2.0编写的代码。
- 请问:我得多长才能达到 vc的使用基本要求?
- 关于ActiveX控件的数字签名和认证问题
- 据说ClassWizard中本身就隐藏着一个打印预览类,请问我怎样才能使用这个类,或者有别的方法来实现. 非常谢谢您的指导.
- 如何自绘曲线图
我试了用SystemParameterInfo好象不行,请高手指教!
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;
您知道如何编程实现关掉需要口令的屏保吗?
当然,有所付出,就有所得。
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标志来获知屏保开始运行。