Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Отключение дисплея   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
15-1265405405
Юрий
2010-02-06 00:30
2010.08.27
С днем рождения ! 6 февраля 2010 суббота


2-1270231741
Vigi
2010-04-02 22:09
2010.08.27
Информация о доступных серверах!


15-1263679001
Кто б сомневался
2010-01-17 00:56
2010.08.27
Закон об авторском праве


15-1271837525
@!!ex
2010-04-21 12:12
2010.08.27
60км/ч -> бетонная стена. Какой результат?


2-1266912051
serko
2010-02-23 11:00
2010.08.27
Как скопировать текст из другого приложения?