В определенный момент требуется выполнить "моментальный" выход из сессии активного пользователя. Под этим понимается отсутствие появления любых окон, задерживающих выход, с момента активации операции выхода.
Судя по описанию, в этом должен помочь следующий вызов из процесса, запущенного в этой сессии:
ExitWindowsEx( EWX_LOGOFF | EWX_FORCE, 0 );
По крайней мере, по поводу флага EWX_FORCE в msdn явно сказано, что при его задании сообщение WM_QUERYENDSESSION не рассылается приложениям: "This flag has no effect if terminal services is enabled. Otherwise, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages...".
Теперь, опишу, что я реально наблюдаю (смотрел на WinXp sp2, win2008R2).
1. Если, например, в сессии отрыть документ в notepad и модифицировать его, и после этого сделать инициировать в этой сесии вызов "ExitWindowsEx( EWX_LOGOFF | EWX_FORCE, 0 );", то notepad отобразит диалог сохранения файла, который висит приблизительно 5 секунд, после этого закрывается и происходит выход из сессии. Если есть несколько процессов с несохраненными документами, то эти диалоги последовательно будут появляться для каждого из этих процессов. В общем, эту процедуру никак нельзя назвать "моментальным" выходом. Насколько я понял, единственное отличие вызова "ExitWindowsEx( EWX_LOGOFF | EWX_FORCE, 0 );" от "ExitWindowsEx( EWX_LOGOFF, 0 );" состоит в том, что первый нельзя прервать: т.е., если в диалоге сохранения нажать "Отмена", это не повлияет на процесс выходи из сессии, во втором же случае выход прервется. Возможно, именно из за этого отличия флаг называется "форсирующим" выход из сессии.
2. После того, как я наткнулся на это несколько неожиданное поведение вызова "ExitWindowsEx( EWX_LOGOFF | EWX_FORCE, 0 );", я решил посмотреть, какие сообщения приходят главному окну notepad после этого вызова. "Натравив" spy на это окно и сделав скриншот окна виртуальной машины, на которой это все крутилось, я увидел, что кроме всего прочего, окну приходит (SendMessage) сообщение WM_QUERYENDSESSION! Видимо, при обработке этого сообщения notepad и выводит диалог сохранения. И скорее всего, назначение флага EWX_FORCE состоит лишь в игнорировании возвращаемого обработчиками значения.
Т.о., вызов "ExitWindowsEx( EWX_LOGOFF | EWX_FORCE, 0 );" оказался непригоден для решения поставленной задачи.
В результате, у меня остался вопрос: как же реализовать "моментальный" выход из сессии активного пользователя? Кстати, аналогичная задача с "моментальной" перезагрузкой решается (судя по описанию, сам не проверял) функцией InitiateSystemShutdown.
VM>В результате, у меня остался вопрос: как же реализовать "моментальный" выход из сессии активного пользователя? Кстати, аналогичная задача с "моментальной" перезагрузкой решается (судя по описанию, сам не проверял) функцией InitiateSystemShutdown.
покиляйте все пользовательские процессы имеющие окна на десктопе, делов то
Как много веселых ребят, и все делают велосипед...
Никакой "дружбы" с пользователемЁ Имхо, смахивает на вирус.
Re: logoff без вопросов
От:
Аноним
Дата:
07.12.11 14:33
Оценка:
Здравствуйте, VoMarch, Вы писали:
VM>В результате, у меня остался вопрос: как же реализовать "моментальный" выход из сессии активного пользователя? Кстати, аналогичная задача с "моментальной" перезагрузкой решается (судя по описанию, сам не проверял) функцией InitiateSystemShutdown.
VM>Заранее, спасибо!
Рекомендую пошаманить с нижеперечисленными ключами в ветке HKCU\Control Panel\Desktop