我想創建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);
做了比我所知的更多的東西。
當屏幕保護程序運行時,它運行在與用戶不同的桌面上。也許你的'ShellExecute'失敗了? –
不是這樣。 'ShellExecute'甚至不會提供任何錯誤代碼。它看起來好像整個屏幕保護程序只是無限期地停下來。 – luda
我的猜測是[你遇到一個小故障(?),其中'SC_MONITORPOWER'不會打開顯示器](http://stackoverflow.com/questions/12572441/sendmessage-sc-monitorpower-wont-turn-monitor -on-時運行窗口-8)。您應該能夠通過隔離運行屏幕保護程序代碼來證明/反駁此問題 - 換句話說,只需測試將屏幕關閉並重新打開的代碼,並查看此問題是否仍然存在。 – computerfreaker