Конференция "WinAPI" » Отключение скринсейвера
 
  • DeadMeat © (09.08.08 22:47) [20]

    > _Milk   (09.08.08 20:16) [19]

    Вы меня поражаете... очень. Вы чуть выше читали? Ладно... перецитирую?

    > Я проверял.... Я всегда проверяю то, о чем пишу..

    По всей видимости, статус скринсейвера вы проверяли по внешнему виду этого окна? А вы попробуйте после
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0);

    подождать выставленный вами интервал... И если скринсейвер после этого заработает, то я специально для Вас переустановлю две висты и одну ХР, на которых я все это проверял... и проверю снова на свежей версии, чтобы исключить баги "древней" установки.
    Потом прошу отписаться сюда....
  • Городской Шаман (10.08.08 00:24) [21]

    > _Milk   (08.08.08 09:40) [15]
    >
    > > DeadMeat   (05.08.08 22:35) [10]
    >
    > > Это не выход... А если зависание системы? Вариантов неожиданного
    > > завершения приложения масса.... поэтому полноценное выключение
    > > заставки не приемлимо.
    >
    > Ты прежде чем постить о "теоретическом" поведении скрисейвера,
    >  лучше бы проверил это практически (Я проверял, завершая
    > их ножиданно. Заставка остается включенной, но во время
    > работы самого плеера не включается)
    > Проверь это практически на своем приложении с SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,
    >  1, nil, 0);
    > а потом уже пости:(


    Угу если программа глюканет то после перезугрузки станет все как раньше, ведь четвёртый параметр
    fWinIni установлен в 0, а вот если установить его в
    SPIF_UPDATEINIFILE ....
  • DeadMeat © (11.08.08 09:04) [22]

    > Городской Шаман   (10.08.08 00:24) [21]

    А "ДО" перезагрузки? Или надо будет в ридми указать, что мол если программа вылетит, то обязательно перезагрузитесь..
    Вот об этом и речь... жаль что уважжаемый _Milk этого не хочет принять.
    Где он кстати? Проверил?
  • ALFA (15.10.08 11:17) [23]
    Программно, раз в минуту например, делай: SetCursorPos(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  • Добежал (22.01.09 19:44) [24]
    Интересно, а я вот не понимаю, каким образом код:

    if (msg.message=WM_SYSCOMMAND) and
           (msg.wParam=SC_SCREENSAVE)  then
         handled:=true
        else
         handled:=false;



    может помочь? Получается, тут только или выставляется handled или нет. Если смотреть VCL:

    function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
    var
     Handled: Boolean;
    begin
     Result := False;
     if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
     begin
       Result := True;
       if Msg.Message <> WM_QUIT then
       begin
         Handled := False;
         if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
         if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
           not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
         begin
           TranslateMessage(Msg);
           DispatchMessage(Msg);
         end;
       end
       else
         FTerminate := True;
     end;
    end;



    От того, выставлен ли Handled, зависит фактически только то, будет ли вызван DispatchMessage.
    В нашем примере при приходе "
    msg.wParam=SC_SCREENSAVE

    " будет handled выставлен в true и соответственно не будет вызван DispatchMessage.

    Не понимаю... А как это выглядит с точки зрения Windows? То есть, перед тем как включить заставку она всем окнам рассылает данное сообщение - логично.
    Но как она потом собирает результат?! Если над этим сообщением все потоки сделали DispatchMessage, то заставка включается, а если поток хоть одного окна не сделал DispatchMessage над этим сообщением - заставка не включается что ли, логика такова? А интересно сколько по времени тогда ждет винда, чтобы все потоки успели сделать DispatchMessage?

    То есть, допустим достаточно всего одного приложения, которое подвисло или еще что и не выбирает из очереди сообщения - чтобы отключения экрана никогда не произошло? Вообще как-то немного бредово выглядит
 
Конференция "WinAPI" » Отключение скринсейвера
Есть новые Нет новых   [134435   +38][b:0][p:0.001]