Завершение сессии
От: maks1180  
Дата: 01.10.11 21:50
Оценка:
При завершении сессии Windows посылает сообщение WM_ENDSESSION.
Если у процесса нет окна, как Windows будет извещать и закрывать процесс ?
===============================================
(реклама, удалена модератором)
Re: Завершение сессии
От: Jolly Roger  
Дата: 02.10.11 03:24
Оценка:
Здравствуйте, maks1180, Вы писали:

M>При завершении сессии Windows посылает сообщение WM_ENDSESSION.

M>Если у процесса нет окна, как Windows будет извещать и закрывать процесс ?

Если Ваш код выполняет что-то вроде этого(псевдокод):

var A = 0;
while(1)
{
  A++;
  stream.write(A);  
}


то как его можно о чём-то известить? Создайте доп.поток с невидимым окном. SetConsoleCtrlHandler примерно так и делает, только ему окна не нужно.
"Нормальные герои всегда идут в обход!"
Re[2]: Завершение сессии
От: x64 Россия  
Дата: 02.10.11 04:19
Оценка:
JR>Создайте доп.поток с невидимым окном.

А разве WM_ENDSESSION не шлётся только видимым top-level окнам, нет?
Re[3]: Завершение сессии
От: Jolly Roger  
Дата: 02.10.11 06:07
Оценка:
Здравствуйте, x64, Вы писали:

JR>>Создайте доп.поток с невидимым окном.


x64>А разве WM_ENDSESSION не шлётся только видимым top-level окнам, нет?


Откровенно говоря, совершенно не помню Ну можно попробовать ссоздать "видимое" окно без рамки и размером в 1 пиксель
"Нормальные герои всегда идут в обход!"
Re[4]: Завершение сессии
От: x64 Россия  
Дата: 02.10.11 10:48
Оценка: +1
JR>Ну можно попробовать ссоздать "видимое" окно без рамки и размером в 1 пиксель

Как по мне, так эту задачу лучше решать написанием службы. Слегка избыточно, наверное, но зато надёжно.
Re: Завершение сессии
От: SuhanovSergey  
Дата: 03.10.11 08:51
Оценка:
Здравствуйте, maks1180, Вы писали:

M>При завершении сессии Windows посылает сообщение WM_ENDSESSION.

M>Если у процесса нет окна, как Windows будет извещать и закрывать процесс ?

Может при этом срабатывает одно из terminal services system events? WTSWaitSystemEvent
Re[4]: Завершение сессии
От: Carc Россия http://www.amlpages.com/home.php
Дата: 05.10.11 11:42
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, x64, Вы писали:


JR>>>Создайте доп.поток с невидимым окном.


x64>>А разве WM_ENDSESSION не шлётся только видимым top-level окнам, нет?


JR>Откровенно говоря, совершенно не помню Ну можно попробовать ссоздать "видимое" окно без рамки и размером в 1 пиксель

А зачем в 1 пиксель?
Можно же хоть в 300 пикселев изваять окно, написать на нем что нить красивое и обязательно матом, убрать его с панели задач, и задвинуть его за края десктопа...

Именно так и сделано в Total Commander, правда несколько для другой цели. Когда тотал падает в трей — главное окно тотала невидимо, создается бутафорское окно — видимое, на тескбаре его нет, но в Alt+Tab оно есть: в результате перебором окон по Alt+Tab можно поднять главное окно Тотала из трея. Ключевой момент: возможность поднятия окна из трея без мыша. Оно вроде и ни к чему, но для клавиатурщиков удобно, и для программеров (иногда так мыша хуками замучаешь, что она "помирает" насмерть — до полного ребута).

Сам так делал — работает как часы.
Aml Pages Home
Re: Завершение сессии
От: acDev Россия  
Дата: 10.10.11 06:58
Оценка:
Здравствуйте, maks1180, Вы писали:

M>При завершении сессии Windows посылает сообщение WM_ENDSESSION.

M>Если у процесса нет окна, как Windows будет извещать и закрывать процесс ?

Перед посылкой WM_ENDSESSION посылается сначала WM_QUERYENDSESSION.
До Висты эти сообщения посылались абсолютно всем top-level окнам, но начиная с Висты посылаются только видимым top-level окнам.
Поэтому на WinXP легко корректно завернить "невидимый" процесс.
Для Висты+ не всё так просто, но при тестировании разных вариантов нашёл решение:
1) Устанавливаем shutdown priority level в ноль (странно что винда позволяет это делать);
2) Ждём в оконном обработчике события WM_SETTINGCHANGE/SPI_SETWORKAREA (его посылает эксплорер при закрытии).
Re[2]: Завершение сессии
От: ononim  
Дата: 10.10.11 08:08
Оценка:
D>2) Ждём в оконном обработчике события WM_SETTINGCHANGE/SPI_SETWORKAREA (его посылает эксплорер при закрытии).
а еще он его пошлет если потягать таскбар
Как много веселых ребят, и все делают велосипед...
Re[3]: Завершение сессии
От: acDev Россия  
Дата: 10.10.11 10:59
Оценка:
Здравствуйте, ononim, Вы писали:

D>>2) Ждём в оконном обработчике события WM_SETTINGCHANGE/SPI_SETWORKAREA (его посылает эксплорер при закрытии).

O>а еще он его пошлет если потягать таскбар

Так для пущей надёжности ставлю ещё нотификатор на ветку реестра:
Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
Вроде бы он редактирует её только при закрытии.
Re[4]: Завершение сессии
От: ononim  
Дата: 10.10.11 12:24
Оценка: +1
D>Так для пущей надёжности ставлю ещё нотификатор на ветку реестра:
D>Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
D>Вроде бы он редактирует её только при закрытии.
Нотификатор штука асинхронная, можно не успеть обработать.
Не понимаю, чо за стремления к дивным извращениям, если уж взападло самому создать хоть какое то окошко, то мона поставить хук на мессаги чужого/чужих.
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.