Здравствуйте, maks1180, Вы писали:
M>При завершении сессии Windows посылает сообщение WM_ENDSESSION. M>Если у процесса нет окна, как Windows будет извещать и закрывать процесс ?
Если Ваш код выполняет что-то вроде этого(псевдокод):
var A = 0;
while(1)
{
A++;
stream.write(A);
}
то как его можно о чём-то известить? Создайте доп.поток с невидимым окном. SetConsoleCtrlHandler примерно так и делает, только ему окна не нужно.
Здравствуйте, maks1180, Вы писали:
M>При завершении сессии Windows посылает сообщение WM_ENDSESSION. M>Если у процесса нет окна, как Windows будет извещать и закрывать процесс ?
Может при этом срабатывает одно из terminal services system events? WTSWaitSystemEvent
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, x64, Вы писали:
JR>>>Создайте доп.поток с невидимым окном.
x64>>А разве WM_ENDSESSION не шлётся только видимым top-level окнам, нет?
JR>Откровенно говоря, совершенно не помню Ну можно попробовать ссоздать "видимое" окно без рамки и размером в 1 пиксель
А зачем в 1 пиксель?
Можно же хоть в 300 пикселев изваять окно, написать на нем что нить красивое и обязательно матом, убрать его с панели задач, и задвинуть его за края десктопа...
Именно так и сделано в Total Commander, правда несколько для другой цели. Когда тотал падает в трей — главное окно тотала невидимо, создается бутафорское окно — видимое, на тескбаре его нет, но в Alt+Tab оно есть: в результате перебором окон по Alt+Tab можно поднять главное окно Тотала из трея. Ключевой момент: возможность поднятия окна из трея без мыша. Оно вроде и ни к чему, но для клавиатурщиков удобно, и для программеров (иногда так мыша хуками замучаешь, что она "помирает" насмерть — до полного ребута).
Здравствуйте, 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 (его посылает эксплорер при закрытии).
D>2) Ждём в оконном обработчике события WM_SETTINGCHANGE/SPI_SETWORKAREA (его посылает эксплорер при закрытии).
а еще он его пошлет если потягать таскбар
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
D>>2) Ждём в оконном обработчике события WM_SETTINGCHANGE/SPI_SETWORKAREA (его посылает эксплорер при закрытии). O>а еще он его пошлет если потягать таскбар
Так для пущей надёжности ставлю ещё нотификатор на ветку реестра:
Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
Вроде бы он редактирует её только при закрытии.
D>Так для пущей надёжности ставлю ещё нотификатор на ветку реестра: D>Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify D>Вроде бы он редактирует её только при закрытии.
Нотификатор штука асинхронная, можно не успеть обработать.
Не понимаю, чо за стремления к дивным извращениям, если уж взападло самому создать хоть какое то окошко, то мона поставить хук на мессаги чужого/чужих.
Как много веселых ребят, и все делают велосипед...