Конференция "KOL" » Отключение дисплея [Delphi]
 
  • rainstuff (24.07.08 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 (24.07.08 12:02) [1]
    И будет пропадать, обработка сообщений идёт на активной форме. Нужен глобальный хук на перехват сообщения SC_MONITORPOWER. Лучше отдельной dll.
  • rainstuff (24.07.08 12:32) [2]
    Вообщем-то я это и подозревал...
    Попробую сделать через SetWindowsHookEx с типом  WH_CALLWNDPROС.
    Не уверен, что можно поставить хук на отлов одного сообщения...

    спасибо!
  • rainstuff (24.07.08 16:31) [3]
    Поставил хук WH_CBT , отловил WM_SYSCOMMAND и SC_MONITORPOWER.
    Проблема теперь с WM_POWERBROADCAST - какой хук надо поставить, чтобы его отловить?
  • Jon © (25.07.08 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 (25.07.08 15:54) [5]
    угу, только есть одна проблемка - та же, что и у меня...
    код будет работать, если активно окошко программы. А если я её свернул, например, и работаю в другой, то такое не пройдёт...
    На данный момент мучаюсь с WM_POWERBROADCAST, чтобы предотвратить ждущий режим. оно вроде отлавливается через хук WH_CALLWNDPROС и WH_CALLWNDPROCRET, передаю вроде через Result и через структуру BROADCAST_QUERY_DENY, но ждущего режима это не предотвращает...
  • Vladimir Kladov © (25.07.08 21:05) [6]
    SystemParamersInfo можно вызывать и по таймеру, достаточно раз в несколько секунд - гарантированно не выключится и не заснёт, потому что в настройках минимальное время до отключения указывается в минутах.
  • rainstuff (25.07.08 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;

 
Конференция "KOL" » Отключение дисплея [Delphi]
Есть новые Нет новых   [134431   +15][b:0][p:0.002]