在VC++中偵測Windows NT的屏幕保護狀態(tài)
發(fā)表時間:2024-02-22 來源:明輝站整理相關軟件相關文章人氣:
[摘要]作者: 廣東省深圳市溫衛(wèi)紅陳耀光 (EwardChen@21cn.com) 開發(fā)基于 Windows NT/2000的程序時,程序員往往需要知道系統(tǒng)是否處于屏幕保護狀態(tài),然后可以根據(jù)不同的狀態(tài)在程序中做出相應的處理,如改變程序運行的優(yōu)先級、先執(zhí)行低優(yōu)先級的例行工作等,以優(yōu)化系統(tǒng)性能。微軟公...
作者: 廣東省深圳市溫衛(wèi)紅陳耀光 (EwardChen@21cn.com)
開發(fā)基于 Windows NT/2000的程序時,程序員往往需要知道系統(tǒng)是否處于屏幕保護狀態(tài),然后可以根據(jù)不同的狀態(tài)在程序中做出相應的處理,如改變程序運行的優(yōu)先級、先執(zhí)行低優(yōu)先級的例行工作等,以優(yōu)化系統(tǒng)性能。微軟公司在 Windows 2000操作系統(tǒng)中提供了 SystemParametersInfo() API函數(shù),可以直接返回系統(tǒng)是否處于屏幕保護狀態(tài)的信息,但是在 Windows NT中并沒有提供,只能由程序員自己編程實現(xiàn)。
在 Windows 3.x/9x操作系統(tǒng)上,可以用 API函數(shù) FindWindow()來判斷某個程序是否正在運行,對于屏幕保護程序也同樣適用。但是此方法在 Windows NT上卻無法實現(xiàn),因為 Windows NT/2000操作系統(tǒng)屏幕保護的實現(xiàn)機制與 Windows 3.x/9x不一樣,前者的屏幕保護程序是運行在操作系統(tǒng)為屏幕保護程序單獨創(chuàng)建的 "虛擬桌面 "上,因此并不能在當前運行的 "用戶桌面 "上找到屏幕保護程序。為此,找到屏幕保護程序的 "虛擬桌面 "成為解決問題的關鍵。下面給出利用 VC++編寫偵測 Windows NT/2000是否處于屏幕保護狀態(tài)的源代碼。
# include
# include
# include
# include
BOOL IsScreenSaverRunning(void)
{
//定義一個 "虛擬桌面 "句柄
HDESK hDesktop;
hDesktop = OpenDesktop(
//操作系統(tǒng)分配給屏幕保護程序 "虛擬桌面 "的標識
TEXT(" screen- saver"),
0,
FALSE,
MAXIMUM_ALLOWED
);
if(hDesktop == NULL) {
//如果打開 "虛擬桌面 "失敗
if(GetLastError()==ERROR_ACCESS_DENIED) /*如果是因為訪問權限不足,則說明該 "虛擬桌面 "已經(jīng)存在,只不過是我們的權限不足而已,此時可以判定系統(tǒng)正處于屏幕保護狀態(tài)。* /
return TRUE;
//如果是其他的失敗情況,則可以判定系統(tǒng)并不處于屏幕保護狀態(tài)
return FALSE;
}
//如果 "虛擬桌面 "能成功打開,則可以判定系統(tǒng)正處于屏幕保護狀態(tài)
//釋放分配到的句柄資源
CloseDesktop(hDesktop);
return TRUE;
}
void main(void)
{
printf(" Detecting ScreenSaver by EdwardChen@21cn.com 2000.10\n");
while(1)
{
char curtime[8+ 1];
//每隔 1分鐘偵測一次
if(IsScreenSaverRunning()) {
printf("% s Screen saver is running!\n",_strtime(curtime) );
}
else {
printf("% s Screen saver is NOT running!\n", _strtime(curtime) );
}
SleepEx(1000* 60, TRUE);
}
}
本程序在 Windows NT/2000上編譯、運行通過。