在VC++中偵測Windows NT的屏幕保護狀態

發表于:2007-07-14來源:作者:點擊數: 標簽:
作者: 廣東省深圳市溫衛紅陳耀光 (EwardChen@21cn.com) 開發 基于 Windows NT/2000的程序時, 程序員 往往需要知道系統是否處于屏幕保護狀態,然后可以根據不同的狀態在程序中做出相應的處理,如改變程序運行的優先級、先執行低優先級的例行工作等,以優化系
作者: 廣東省深圳市溫衛紅陳耀光 (EwardChen@21cn.com)

   開發基于 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 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上編譯、運行通過。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97