Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

Запретить Windows уходить в hibernate и отключать экран   Найти похожие ветки 

 
Добежал   (2009-01-19 19:40) [0]

Хочется сделать так, как это реализовано в видео-плеерах. То есть, запретить Windows отключать дисплей, уходить в hibernate и подобное на время, пока приложение запущено. Даже если в это время никакие клавиши не нажимаются и мышка не двигается.


 
KSergey ©   (2009-01-19 20:13) [1]

а может это просто выключить в винде?


 
TUser ©   (2009-01-19 20:18) [2]

По крайней мере частично поможет

The WM_QUERYENDSESSION message is sent when the user chooses to end the Windows session or when an application calls the ExitWindows function. If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

не знаю, как там с хибернацией


 
ketmar ©   (2009-01-19 20:19) [3]

скучная копипаста из smplayer:
bool BaseGui::winEvent ( MSG * m, long * result ) {
 //qDebug("BaseGui::winEvent");
 if (m->message==WM_SYSCOMMAND) {
   if ((m->wParam & 0xFFF0)==SC_SCREENSAVE || (m->wParam & 0xFFF0)==SC_MONITORPOWER) {
     qDebug("BaseGui::winEvent: received SC_SCREENSAVE or SC_MONITORPOWER");
     if ((pref->disable_screensaver) && (core->state()==Core::Playing)) {
       qDebug("BaseGui::winEvent: not allowing screensaver");
       (*result) = 0;
       return true;
     } else {
       if ((pref->disable_screensaver) && (just_stopped)) {
         qDebug("BaseGui::winEvent: file just stopped, so not allowing screensaver for a while");
         (*result) = 0;
         return true;
       } else {
         qDebug("BaseGui::winEvent: allowing screensaver");
         return false;
       }
     }
   }
 }
 return false;
}

и ещё:

void WinScreenSaver::disable() {
 qDebug("WinScreenSaver::disable");

 if (!state_saved) {
   SystemParametersInfo(SPI_GETLOWPOWERTIMEOUT, 0, &lowpower, 0);
   SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0, &poweroff, 0);
   SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &screensaver, 0);
   state_saved = true;
 }

 qDebug("WinScreenSaver::disable: lowpower: %d", lowpower);
 qDebug("WinScreenSaver::disable: poweroff: %d", poweroff);
 qDebug("WinScreenSaver::disable: screensaver: %d", screensaver);

 if (lowpower != 0) SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, 0, NULL, 0);
 if (poweroff != 0) SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, NULL, 0);
 if (screensaver != 0) SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, 0, NULL, 0);
}

void WinScreenSaver::restore() {
 qDebug("WinScreenSaver::restore");

 if (state_saved) {
   if (lowpower != 0) SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, lowpower, NULL, 0);
   if (poweroff != 0) SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, poweroff, NULL, 0);
   if (screensaver != 0) SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, screensaver, NULL, 0);
 } else {
   qWarning("WinScreenSaver::restore: screensaver can"t be restored");
 }
}


есть мнение, что этого должно хватить для самостоятельного разбора.

---
Understanding is not required. Only obedience.


 
DeadMeat   (2009-01-19 20:37) [4]

http://delphimaster.net/view/4-1217672834/


 
Добежал   (2009-01-20 12:19) [5]


> По крайней мере частично поможет

TUser, ты вообще понял о чем ветка то? Причем тут завершение сессии вообще?


> скучная копипаста из smplayer:

не катит... В ветке DeadMeat приведена цитата из MS:

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.

to DeadMeat, нда... Я тоже удивлен, что нету способа окромя эмуляции нажатий клавиш... И сама MS это рекомендует?! Впрочем в ихнем примере я тоже не понял почему ( http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/Interaction/264.mspx )

Листинг 2.
" посылка символа в буфер клавиатуры
Call SendMyKey(Chr$(9)) " клавиша Tab
" почему-то нужно сделать вывод окна
" — тогда срабатывает посылка символа
MsgBox "Hello!"

Мы не смогли понять почему, но посланный символ срабатывает только в случае, если программа потом выдает на экран еще какое-либо окно.


Почему это даже MS не знает и вообще почему нужно показывать какое-то окно, чтобы посылка символа "засчиталась"?! Бред какой-то... Получается раз в минуту там допустим нужно посылать код клавиши да еще какое-то окно выводить при этом?


 
Добежал   (2009-01-20 12:34) [6]

DeadMeat, и еще вопрос - тут разговор именно о скринсейве. Но я не знаю - отключение экрана и скринсейвер это взаимосвязанные операции? То есть, ведь может быть так, что скринсейвер отключен, но зато указано отключение монитора через допустим 5 минут. При таких настройках все равно будет посылаться сообщение SC_SCREENSAVE? Ты что об этом думаешь?

И вообще, ты сам в результате как реализовал?


 
ketmar ©   (2009-01-20 16:28) [7]

то есть, копипастил я зря. ну и иди нафиг, ректалоинженер.

---
All Your Base Are Belong to Us


 
Agent13 ©   (2009-01-20 23:21) [8]

По поводу засыпания системы и отключки экрана:
http://msdn.microsoft.com/en-us/library/aa373208.aspx


 
DeadMeat   (2009-01-21 10:24) [9]


> Agent13 ©   (20.01.09 23:21) [8]

Все бы ничего, но вот:

> ES_CONTINUOUS
> Informs the system that the state being set should remain
> in effect until the next call that uses ES_CONTINUOUS and
> one of the other state flags is cleared.

Т.е. если не вызвать с этим флагом второй раз, то ничего назад не вернется.
И далее там же:

> This function does not stop the screen saver from executing.

Сам сейчас пробовал. Правда не останавливает.


 
ketmar ©   (2009-01-21 12:29) [10]

>[9] DeadMeat (2009-01-21 10:24:00)
а я таки упорно не понимаю, чем не нравится копипаста из smplayer"а. ну, кроме того, что требует привилегий на смену некоторых параметров. однако ж в задаче на это ограничений нет.

---
All Your Base Are Belong to Us


 
DeadMeat   (2009-01-21 12:59) [11]


> ketmar ©   (21.01.09 12:29) [10]

Ну чем не нравится автору мне не известно, а мне не нравится тем, что при аварийном завершении приложения, параметры не восстановятся.
Т.е. с одной стороны вроде и правильно так делать, но с другой...


 
Добежал   (2009-01-21 13:15) [12]


> а мне не нравится тем, что при аварийном завершении приложения,
>  параметры не восстановятся


абсолютно тем же не нравится, и это все грамотно расписано в ветке http://delphimaster.net/view/4-1217672834/ которую ketmar видимо не читал но в своем фирменном стиле все равно по старинке всех обосрал.


 
Добежал   (2009-01-21 13:16) [13]

DeadMeat, как в результате ты все таки реализовал? Или ты в процессе?


 
DeadMeat   (2009-01-21 13:26) [14]


> Добежал

SendInput с INPUT_MOUSE и нулевыми координатами вызывай раз в 50 секунд и все.


 
ketmar ©   (2009-01-21 13:30) [15]

>[11] DeadMeat (2009-01-21 12:59:00)
>а мне не нравится тем, что при аварийном завершении приложения, параметры не
>восстановятся.

мне что, надо было весь код написать за топикстартера? в том числе и отлов аварийных завершений с восстеновлением параметров? или топикстартер таки включит мозг и сделает это сам?

зыж а тут ещё удивляются в другом топике, почему помогать никто не хочет. неужто всё ещё непонятно? задолбали. всё больше думаю, что шутка про идеальную IDE с одной кнопкой была совсем не шуткой…

---
Understanding is not required. Only obedience.


 
Добежал   (2009-01-21 13:49) [16]


> SendInput с INPUT_MOUSE и нулевыми координатами

в смысле с нулевыми? Так тогда ж мышка будет улетать каждые 50 секунд в левый верхний угол, это как-то не фонтан.


> мне что, надо было весь код

тебе мне кажется надо перестать форумы посещать. Вот есть люди типа Юрия Зотова - почему от них никогда не дождешься такого? Ты же в любой абсолютно ветке так себя ведешь. Я не видел НИ РАЗУ, чтобы отвечая на вопрос ты не обосрал автора топика. Просто не помню такого. Имхо, самореализацию лучше перенести в реальность.


 
Игорь Шевченко ©   (2009-01-21 13:58) [17]

Добежал   (21.01.09 13:49) [16]


> тебе мне кажется надо перестать форумы посещать


Скорее тебе следует перестать их посещать. Потому что ветки с втоим участием чаще всего перерастают в свару не в последнюю очередь из-за твоих хамских манер. Можешь считать этот пост официальным предупреждением и не разводить дискуссию на эту тему.


 
ketmar ©   (2009-01-21 14:12) [18]

Удалено модератором


 
Добежал   (2009-01-22 18:43) [19]

Удалено модератором
Примечание: Создание пустых сообщений


 
Добежал   (2009-01-23 12:13) [20]

Интересно, а я вот не понимаю, каким образом код:

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?

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



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.054 c
15-1232633470
Городской Шаман
2009-01-22 17:11
2009.03.29
Вопрос по газовым проточным водонагревателям(колонка).


2-1234238813
Программер
2009-02-10 07:06
2009.03.29
расшифровать кодировку


15-1232302539
ocean
2009-01-18 21:15
2009.03.29
Вербер "Имрерия ангелов"


15-1232703880
123-ий
2009-01-23 12:44
2009.03.29
Шестисотая БМВ


2-1233739538
zorik
2009-02-04 12:25
2009.03.29
Смена типа на ходу





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский