明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

在VC++中偵測Windows NT的屏幕保護狀態(tài)

[摘要]作者: 廣東省深圳市溫衛(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上編譯、運行通過。