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