2011-05-05 66 views
1

下午好,我有一段代碼用於監視Windows XP以後的屏幕保護程序活動,目前它可以在Windows 7以外的所有Windows操作系統上正常運行,我知道某些屏幕保護程序參數來SystemParametersInfo函數不可用在Windows 7,但認爲SPI_GETSCREENSAVERRUNNING可用,代碼如下:在Windows 7上監視屏幕保護程序活動失敗

BOOL bScrnSvrRunning = FALSE; 
BOOL bResult = SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &boolScreenSaverRunning, 0); 

的功能總是bResult返回true,但bScrnSvrRunning永遠是假的,

有沒有人有任何想法可能會導致此?

回答

2

您正在使用錯誤的參數「插槽」。在SystemParametersInfo聲明仔細一看:

BOOL WINAPI SystemParametersInfo(
    __in  UINT uiAction, 
    __in  UINT uiParam, 
    __inout PVOID pvParam, 
    __in  UINT fWinIni 
); 

讓我引用信息的SPI_GETSCREENSAVERRUNNING

確定是否一個屏幕保護程序正在調用進程的窗口站上運行。 pvParam參數必須指向BOOL變量,如果屏幕保護程序當前正在運行,則該變量接收TRUE,否則指向FALSE。

pvParam是臨危該信息的人,所以你必須在pvParam參數提供您BOOL:

BOOL bScrnSvrRunning = FALSE; 
BOOL bResult = SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &boolScreenSaverRunning, 0); 
+0

我這樣做,bScrnSvrRunning傳遞到pvParam插槽 – user698391 2011-05-05 13:39:01

+0

@ user698391:不在您的代碼示例中,請嘗試複製/粘貼我的代替您的代碼並查看它是否有效。 – orlp 2011-05-05 13:40:19

+0

aaah我看到道歉,我正在一個單獨的網絡上工作,不得不重新輸入我的代碼,我添加了一個額外的「,0」,那裏沒有一個,我的代碼反映了你的,正如我之前說過的,除Windows 7以外的所有其他操作系統 – user698391 2011-05-05 13:50:58

1

如果你真的想監控屏幕保護程序活動,你可以考慮使用系統事件通知服務(SENS)。系統事件通知服務在那裏監視和發送,因此它可以通知您的應用程序有關屏幕保護程序的開始(請參閱ISensLogon::StartScreenSaver)和停止(請參閱ISensLogon::StopScreenSaver)許多事件。一個示例如何使用SENS,您可以找到here(另請參閱herehere)。

相關問題