-
Пытаюсь предотвратить отключение дисплея, когда работает моя прога. Написал такой нехитрый код:
function TForm1.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean; begin Result:=false; if ((Msg.message=WM_SYSCOMMAND) and (Msg.wParam=SC_MONITORPOWER)) then Result:=true; end;
Проблема в том, что сообщение обрабатывается только если окно моей программы активно. В противном случае - оно туда не попадает. Посоветуете что-нить?
-
И будет пропадать, обработка сообщений идёт на активной форме. Нужен глобальный хук на перехват сообщения SC_MONITORPOWER. Лучше отдельной dll.
-
Вообщем-то я это и подозревал... Попробую сделать через SetWindowsHookEx с типом WH_CALLWNDPROС. Не уверен, что можно поставить хук на отлов одного сообщения...
спасибо!
-
Поставил хук WH_CBT , отловил WM_SYSCOMMAND и SC_MONITORPOWER. Проблема теперь с WM_POWERBROADCAST - какой хук надо поставить, чтобы его отловить?
-
function KOLForm1Message (var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result := False;
case Msg.message of
WM_POWERBROADCAST:
begin
case Msg.wParam of
PBT_APMQUERYSUSPEND,
PBT_APMQUERYSTANDBY:
begin
Rslt := BROADCAST_QUERY_DENY;
Result := True;
end;
end;
end;
WM_SYSCOMMAND:
begin
case Msg.wParam of
SC_SCREENSAVE:
begin
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1,nil,0);
Result := True;
end;
SC_MONITORPOWER:
begin
SystemParametersInfo(SPI_SETLOWPOWERACTIVE,0,nil,0);
SystemParametersInfo(SPI_SETPOWEROFFACTIVE,0,nil,0);
Result := True;
end;
end;
end;
end;
end;
-
угу, только есть одна проблемка - та же, что и у меня... код будет работать, если активно окошко программы. А если я её свернул, например, и работаю в другой, то такое не пройдёт... На данный момент мучаюсь с WM_POWERBROADCAST, чтобы предотвратить ждущий режим. оно вроде отлавливается через хук WH_CALLWNDPROС и WH_CALLWNDPROCRET, передаю вроде через Result и через структуру BROADCAST_QUERY_DENY, но ждущего режима это не предотвращает...
-
SystemParamersInfo можно вызывать и по таймеру, достаточно раз в несколько секунд - гарантированно не выключится и не заснёт, потому что в настройках минимальное время до отключения указывается в минутах.
-
С помощью SystemParamersInfo можно предотвратить спящий режим? Если не секрет - как? я нашёл только отключение монитора и скринсейвер. Тогда я просто в хук WH_CALLWNDPROС пропишу и всё - там отлавливается без проблем(только предотвратить не удаётся...) и можо без таймера обойтись... хотя, неизвестно что лучше:))) Если кому интересно вот код: для dll: GlobalData^.SysHook := SetWindowsHookEx(WH_CBT, @SysMsgProc, HInstance, 0);
function SysMsgProc(code : integer; wParam : word; lParam : longword) : longword; stdcall;
begin
if code=HCBT_SYSCOMMAND then begin
if ((WParam=SC_SCREENSAVE)) then begin
Result:=longint(true);
exit;
end;
if ((WParam=SC_MONITORPOWER)) then begin
Result:=longint(true);
exit;
end;
end; Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end;
для *.exe и активного окна приложения:function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result:=false;
if ((Msg.message=WM_SYSCOMMAND) and ((Msg.wParam=SC_MONITORPOWER)or(Msg.wParam=SC_SCREENSAVE))) then begin
Result:=true;
Rslt:=0;
end;
if ((Msg.message=WM_POWERBROADCAST)and(Msg.wParam=PBT_APMQUERYSUSPEND)) then begin
Result:=true;
Rslt:=BROADCAST_QUERY_DENY;
end;
end;
|