Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1265314234
Kerk
2010-02-04 23:10
2010.08.27
Задачка


15-1268689777
Германн
2010-03-16 00:49
2010.08.27
Build Events в опциях проекта.


15-1273672717
istok
2010-05-12 17:58
2010.08.27
посоветуйте компоненты для DashBoard...


15-1274862307
xayam
2010-05-26 12:25
2010.08.27
Антикомпьютерный контроль (АКК)


6-1205426277
Dima
2008-03-13 19:37
2010.08.27
WinAPI + скачивание файла по http (просто)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский