Конференция "WinAPI" » Отключение скринсейвера
 
  • DeadMeat © (02.08.08 14:27) [0]
    Здравсте.
    Не знал где писать, здесь или в Медиа. Но написал здесь, т.к. это касается WinAPI больше, чем Медиа.
    И так... собсна сабж.
    Как отключить (или предотвратить) запуск скринсейвера во время работы моего приложения?
    Следующие варианты исключаются:
    стереть из system.ini или реестра (SystemParametersInfo делает примерно тоже)
    самому стать скринсейвером
    забивать процесс скринсейвера при запуске
    "двигать мышку" или "нажимать клаву" для имитации работы юзера

    т.к. при неожиданном прекращении работы приложения, восстановить предыдущие значение не реально, а двигать туда-сюда мышь (даже если это визуально не видно) не красиво.

    Пробовал перехват WM_SYSCOMMAND с параметром SC_SCREENSAVE, но прочитав чуть ниже (в МСДН) понял, что не подходит:
    [i]Microsoft Windows Vista and later: If password protection is enabled by policy, the screen saver is started regardless of what an application does with the SC_SCREENSAVE notification—even if fails to pass it to DefWindowProc.[/i]
    Возникает вопрос - а как же? Ведь разные видео плееры это делают даже на Висте с установленным паролем....
  • Фишер (02.08.08 14:59) [1]
    В каком-то из старых FAQ нашел:

    Как  запретить  запускаться  скринсэйверу,  когда  моя  программа
     активна?

     
     unit Unit1;
     
     interface
     
     uses
       Windows, Messages, SysUtils, Classes, Graphics, Controls,
       Forms, Dialogs, StdCtrls, ExtCtrls;
       
     type
       TForm1 = class(TForm)
         RadioGroup1: TRadioGroup;
         procedure FormCreate(Sender: TObject);
           private
           procedure ProcessMess(var msg:TMsg; var handled:boolean) ;
         { Private declarations }
       public
         { Public declarations }
       end;
       
     var
       Form1: TForm1;
       
     implementation
     
     {$R *.DFM}
     
     { TForm1 }
     procedure TForm1.ProcessMess(var msg: TMsg; var handled: boolean);
     begin
         if (msg.message=WM_SYSCOMMAND) and
            (msg.wParam=SC_SCREENSAVE)  then
          handled:=true
         else
          handled:=false;
     end;
     
     procedure TForm1.FormCreate(Sender: TObject);
     begin
     Application.OnMessage:=ProcessMess;
     end;
     
     end.

  • DeadMeat © (02.08.08 15:17) [2]

    > Фишер   (02.08.08 14:59) [1]


    > DeadMeat ©   (02.08.08 14:27) 

    Пробовал перехват WM_SYSCOMMAND с параметром SC_SCREENSAVE, но прочитав чуть ниже (в МСДН) понял, что не подходит:
    Microsoft Windows Vista and later: If password protection is enabled by policy, the screen saver is started regardless of what an application does with the SC_SCREENSAVE notification—even if fails to pass it to DefWindowProc.
  • DeadMeat © (05.08.08 17:47) [3]
    Никто не против, если я слегонца апну ветку?
  • Фишер (05.08.08 18:23) [4]
    На DelphiWord есть такой код:

    Как отключить хранитель экрана
    Автор: Олег Кулабухов

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     {Turn it off}
     SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0);

     {Turn it on}
     SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, nil, 0);
    end;


    Сам не проверял:(
  • DVM © (05.08.08 18:38) [5]

    > Фишер   (05.08.08 18:23) [4]


    > Следующие варианты исключаются:
    > стереть из system.ini или реестра (SystemParametersInfo
    > делает примерно тоже)
  • Фишер (05.08.08 18:52) [6]
    > Как отключить (или предотвратить) запуск скринсейвера во
    > время работы моего приложения?


    Так это ж только на время работы приложения, при выходе
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, nil, 0);

  • DVM © (05.08.08 18:53) [7]

    > Так это ж только на время работы приложения, при выходе

    а если программа вылетела с ошибкой или ее убили через TerminateProcess? Заставка так и останется выключенной.
  • Фишер (05.08.08 19:04) [8]

    > DVM ©   (05.08.08 18:53) [7]

    В любом случае могут выдернуть шнур из UPS, или нажать Reset, да мало ли форсмажорных ситуаций.
    Если программа вылетела с ошибкой, то надо "лечить" программу. И если юзер вынужден убивать ее с помошью TerminateProcess, то это тоже проблема данного приложения.
  • DVM © (05.08.08 22:33) [9]

    > Фишер   (05.08.08 19:04) [8]

    Это не я так хочу, это DeadMeat-у так хочется.
  • DeadMeat (05.08.08 22:35) [10]
    > [8] Фишер   (05.08.08 19:04)

    Это не выход... А если зависание системы? Вариантов неожиданного завершения приложения масса.... поэтому полноценное выключение заставки не приемлимо.
    И все же.... как то медиаплееры ведь это делают. Я проверял, завершая их ножиданно. Заставка остается включенной, но во время работы самого плеера не включается.
  • DVM © (05.08.08 22:59) [11]

    > DeadMeat   (05.08.08 22:35) [10]

    Наверное ничего нового, но все же (советуют иммитировать нажатия на клавиатуру) http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/Interaction/264.mspx
  • brother © (06.08.08 05:24) [12]
    прочитать из реестра через сколько мин запускается заставка, и чуть до этого посылать нажатие клавиши (какой - на выбор ))
  • DeadMeat © (06.08.08 09:42) [13]

    > DVM ©   (05.08.08 22:59) [11]

    Мда... ну если на майкрософте такой способ предлагают....
    Все-же странно, что нет штатного способа для этого. Т.е. он был, но теперь "перестал быть".

    > brother ©   (06.08.08 05:24) [12]

    Видимо придется все-таки делать таким способом.. Эхх.....

    Спасибо всем...

    ЗЫ. Но если вдруг, кто найдет еще способ "постандартнее", то пожалуйста, дайте знать...
  • miek (08.08.08 09:15) [14]
    единственный стандартный способ - WM_SYSCOMMAND+SC_SCREENSAVE
    поскольку отключение скринсейвера - само по себе нстандартно
  • _Milk (08.08.08 09:40) [15]
    > DeadMeat   (05.08.08 22:35) [10]

    > Это не выход... А если зависание системы? Вариантов неожиданного
    > завершения приложения масса.... поэтому полноценное выключение
    > заставки не приемлимо.


    Ты прежде чем постить о "теоретическом" поведении скрисейвера, лучше бы проверил это практически (Я проверял, завершая их ножиданно. Заставка остается включенной, но во время работы самого плеера не включается)
    Проверь это практически на своем приложении с
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, nil, 0);


    а потом уже пости:(
  • DeadMeat (09.08.08 19:48) [16]
    > [14] miek   (08.08.08 09:15)

    Эмм... чуть выше я про это написал уже.


    > [15] _Milk   (08.08.08 09:40)

    А вот для абсолютных дЭбилов, которые знают обо всем только в теории.... можно объяснить смысл сего поста? Только так, чтобы я понял.. Если можно конечно....
  • _Milk (09.08.08 19:55) [17]
    Ну, а если конкретно, то заверши свое приложение аварийно (да хоть вытащи вилку из розетки во время работы твоего приложения), потом перезагрузись, проверь - свойства экрана - заставка - интервал. Если удивишься (или нет) сообщи.
  • DeadMeat © (09.08.08 20:11) [18]

    > _Milk   (09.08.08 19:55) [17]

    Вы знаете... уважжаемый. Я проверял.... Я всегда проверяю то, о чем пишу.. То, что профиль не обновился, это понятно... И теперь вы предлагаете после неожиданного завершения программы каждый раз перегружать компьютер чтобы заработал скринсейвер? Заставка не заработает, если было сделано 0 и не сделано 1, пока не будет "перезапущен" профиль юзера.
    Дальше объяснять будете? Я с удовольствием выслушаю... Может найдем таки способ "нормальный".
  • _Milk (09.08.08 20:16) [19]
    Дорогой мой, неужели абсолютно все нужно распИсывать по пунктам? Не перезагружайтесь, "убейте" свое приложение любым другим не ординарным способом (боюсь что-либо предлагать) и далее
    > проверь - свойства экрана - заставка - интервал. Если удивишься  (или нет) сообщи.
 
Конференция "WinAPI" » Отключение скринсейвера
Есть новые Нет новых   [134435   +38][b:0][p:0.002]