Форум: "KOL";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизОтключение дисплея Найти похожие ветки
← →
rainstuff (2008-07-24 11:59) [0]Пытаюсь предотвратить отключение дисплея, когда работает моя прога.
Написал такой нехитрый код:
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;
Проблема в том, что сообщение обрабатывается только если окно моей программы активно. В противном случае - оно туда не попадает.
Посоветуете что-нить?
← →
Demt (2008-07-24 12:02) [1]И будет пропадать, обработка сообщений идёт на активной форме. Нужен глобальный хук на перехват сообщения SC_MONITORPOWER. Лучше отдельной dll.
← →
rainstuff (2008-07-24 12:32) [2]Вообщем-то я это и подозревал...
Попробую сделать через SetWindowsHookEx с типом WH_CALLWNDPROС.
Не уверен, что можно поставить хук на отлов одного сообщения...
спасибо!
← →
rainstuff (2008-07-24 16:31) [3]Поставил хук WH_CBT , отловил WM_SYSCOMMAND и SC_MONITORPOWER.
Проблема теперь с WM_POWERBROADCAST - какой хук надо поставить, чтобы его отловить?
← →
Jon © (2008-07-25 13:37) [4]
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;
← →
rainstuff (2008-07-25 15:54) [5]угу, только есть одна проблемка - та же, что и у меня...
код будет работать, если активно окошко программы. А если я её свернул, например, и работаю в другой, то такое не пройдёт...
На данный момент мучаюсь с WM_POWERBROADCAST, чтобы предотвратить ждущий режим. оно вроде отлавливается через хук WH_CALLWNDPROС и WH_CALLWNDPROCRET, передаю вроде через Result и через структуру BROADCAST_QUERY_DENY, но ждущего режима это не предотвращает...
← →
Vladimir Kladov © (2008-07-25 21:05) [6]SystemParamersInfo можно вызывать и по таймеру, достаточно раз в несколько секунд - гарантированно не выключится и не заснёт, потому что в настройках минимальное время до отключения указывается в минутах.
← →
rainstuff (2008-07-25 22:52) [7]С помощью SystemParamersInfo можно предотвратить спящий режим?
Если не секрет - как? я нашёл только отключение монитора и скринсейвер.
Тогда я просто в хук WH_CALLWNDPROС пропишу и всё - там отлавливается без проблем(только предотвратить не удаётся...) и можо без таймера обойтись... хотя, неизвестно что лучше:)))
Если кому интересно вот код:
для dll://вызов:
GlobalData^.SysHook := SetWindowsHookEx(WH_CBT, @SysMsgProc, HInstance, 0);
function SysMsgProc(code : integer; wParam : word; lParam : longword) : longword; stdcall;
begin
//===========WH_CBT=======
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;//code
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;
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.057 c