2010-02-01 140 views
1

當屏幕保護程序即將啓動時,我想在我的C++應用程序中收到通知。我試着用wParam == SC_SCREENSAVE收聽WM_SYSCOMMAND消息,其中some people think should do the trick。 這沒有奏效。 Spy ++甚至顯示我的窗口沒有收到任何WM_SYSCOMMAND消息。有趣的是,當我關掉監視器時,我收到了wParam == SC_MONITORPOWER的消息。我理解錯了嗎?或者我錯過了什麼?接收屏幕保護程序通知

編輯:爲了測試我使用了默認的windows屏幕保護程序(帶有windows徽標的那個)。

+0

對於測試,你有一個實際的屏幕保護程序集,或者它只是一個黑屏? – 2010-02-01 15:02:41

回答

1

看來我只有在我的窗口有焦點時纔會收到SC_SCREENSAVE消息。解決方法是設置global hook。這將需要我put the callback function in a separate DLL,也有關於鉤子放緩系統的這個可怕的消息,所以我決定放棄響應屏幕保護開始的想法。

0

這是一個相對複雜的任務(雖然它會很好,如果它很容易)。

其中一些在線發現的測試僅適用於您的窗口焦點。如果它在後臺運行,它可能不會收到這樣的消息。

其他測試依賴運行的屏幕保護程序(檢查當前設置的屏幕保護程序,然後觀察進程列表以查看它是否處於活動狀態),但在進入powersave模式時不工作,或者屏幕保護程序爲黑色屏幕(即沒有節目,只是監視關閉)。

我不相信有一個理想的方法來做到這一點。您可能想回到起點,並更仔細地考慮爲什麼需要檢測這種狀態,以及您想要完成的工作。您可能需要不同的解決方案。

+0

我想以不顯眼的方式通知用戶。我的想法是在屏幕保護程序啓動或顯示器開機時顯示它。這樣我就不會中斷任何事情。 – MMx 2010-02-03 13:44:56

0

也許我的回答來得太晚。

MSDN處理「傳統」下的屏幕保護程序。 在筆記本電腦上,他們浪費電池,在個人電腦上也沒用。 關閉顯示器比讓它顯示屏幕保護程序更好。

由於您沒有準確解釋您想要執行的操作,因此我不知道您是否真的需要保存程序啓動之前的通知,或者是否已足夠在剛剛啓動時收到通知。

在後一種情況下很容易。 寫一個線程,定期檢查:

BOOL b_SaverRunning; 
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &b_SaverRunning, 0); 
相關問題