2014-05-09 171 views
1

我想創建Windows屏幕保護程序,根據人臉檢測開啓和關閉顯示器。這裏是esential代碼(C++和WINAPI):Windows C++屏幕保護程序不會回到屏幕上

#define TIMER 1010 
unsigned int FREQUENCY_OF_CHECK = 5000; 
LRESULT WINAPI ScreenSaverProc(
    HWND hwnd, 
    UINT message, 
    WPARAM wParam, 
    LPARAM lParam) 
{ 
    if(!fChildPreview) 
    { 
    switch(message) 
    { 
     case WM_CREATE: 
     //start timer 
     SetTimer(hwnd, TIMER, FREQUENCY_OF_CHECK, NULL); 
     //create transparent see thru layer 
     SetWindowLong(
       hwnd, 
       GWL_EXSTYLE, 
       GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED 
       ); 
     break; 

     case WM_DESTROY: 
     SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) -1); 
     KillTimer(hwnd, TIMER); 
     break; 

     case WM_TIMER: 
     //separate process detects face and stores detection into registry 
     if(!ProcessRunning("capture.exe")){ 
      ShellExecute(
       NULL, 
       "open", 
       "C:/camsaver/capture.exe", 
       "", 
       "", 
       SW_SHOWNOACTIVATE); 
     } 
     //load detection from registry and then turn monitor on/off 
     bool face; 
     readFaceFromRegistry(face); 

     if (face){ 
      //turn monitor on 
      SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) -1); 
     } 
     else { 
      //turn monitor off 
      SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2); 
     } 

     break; 

     default: 
     return DefScreenSaverProc(hwnd, message, wParam, lParam); 
     } 
    return 0; 
    } 
} 

如果屏幕保護程序運行本身,當它不人臉檢測,它只是關閉監視器並停止做其他事情。
我希望它繼續運行,並在檢測到臉部時重新開啓屏幕。就像在預覽模式下運行一樣。
我的猜測是,行SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2);做了比我所知的更多的東西。

+1

當屏幕保護程序運行時,它運行在與用戶不同的桌面上。也許你的'ShellExecute'失敗了? –

+0

不是這樣。 'ShellExecute'甚至不會提供任何錯誤代碼。它看起來好像整個屏幕保護程序只是無限期地停下來。 – luda

+1

我的猜測是[你遇到一個小故障(?),其中'SC_MONITORPOWER'不會打開顯示器](http://stackoverflow.com/questions/12572441/sendmessage-sc-monitorpower-wont-turn-monitor -on-時運行窗口-8)。您應該能夠通過隔離運行屏幕保護程序代碼來證明/反駁此問題 - 換句話說,只需測試將屏幕關閉並重新打開的代碼,並查看此問題是否仍然存在。 – computerfreaker

回答

0

所以在Win7顯然SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2);不僅關閉屏幕也將關閉屏幕保護(甚至沒有打擾先發送它至少destoy消息)。沒有簡單的方法來破解這個。
參考:我發現this,它也導致一些其他線程在msdn。 (由於我的聲望,我現在無法鏈接)

雖然我在上面,但上述代碼不適用於Win8,因爲SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) -1);在Win8中沒有打開屏幕。然而,這應該很容易解決,如在this C# workaround

+0

如果我正在閱讀這個權利,'SC_MONITORPOWER'不*改變*顯示器的狀態,它*通知*您的變化。 –

+0

當然,但據我瞭解,它可能會改變屏幕的狀態,因爲谷歌告訴我,這是通過WinAPI關閉屏幕的唯一方法。在保存者中截取消息是沒有意義的,因爲它是來自消息的地方。還有一些方法可以告訴系統,你希望一個應用程序運行而不管什麼('SetThreadExecutionState'),但它不適用於保護程序。 – luda

相關問題