2013-04-25 7 views
3

Я работаю над основанной на терминалах системой, работающей в Windows 2003. Он состоит из приложения для замещения рабочего стола, с которого пользователь запускает программы. Он также имеет кнопку выхода из системы. Когда пользователь выходит из системы, должны произойти две вещи. Во-первых, он выходит из окон. Затем вызывается хранимая процедура очистки состояния базы данных пользователей. Это почти прекрасно работает, но для одной ситуации, и именно тогда пользователь отменяет событие выхода из системы. Типичный сценарий: 1- Пользователь регистрируется, запускает MS Word, редактирует документ, не сохраняет. 2 - Затем пользователь нажимает кнопку выхода из системы. 3- MS Word реагирует на это, прося пользователя сохранить изменения. 4 - Пользователь нажимает отменить.Как снять логотип в Windows Server 2003

На данный момент настольное приложение, возможно, уже вызвало хранимая процедура очистки состояния базы данных. Как я могу поймать это поведение в настольном приложении? Есть ли сообщение о том, что операция конечного сеанса была отменена?

Имеет ли смысл мой вопрос?

О, все приложения написаны на Delphi 7, но я также работаю на C, C++ и C#, поэтому ответы на этих языках также оценены.

+0

Вы можете управлять службой на этой машине? ... также, пытались ли вы запустить свою хранимую процедуру с помощью сценария выхода из группы на основе grouppolicy? – DarkSquirrel42

+1

Я думаю, вы должны вместо этого попытаться обнаружить фактический выход из системы и предположить, что он отменен иначе: Word-cancel происходит, когда сообщение 'WM_QUERYENDSESSION' отправляется в Word; Если выход из системы отменен, система никогда не отправит сообщение «WM_ENDSESSION». – Medinoc

+0

@Medinoc: Документация MSDN гласит: «Когда приложение возвращает TRUE для WM_QUERYENDSESSION, оно получает сообщение WM_ENDSESSION, и оно завершается независимо от того, как другие приложения отвечают на сообщение WM_QUERYENDSESSION». Это означает, что приложение для замены рабочего стола получит WM_ENDSESSION, даже если оно отменено словом. – Pelle

ответ

0

Если ваша логика состояния пользователя находится внутри замены вашей оболочки, тогда подумайте о редизайне приложения: Отмените настраиваемую оболочку от управления сеансом.

Например: Переместите логику состояния пользователя в службу. Внутри этого регистра сервиса для RDS-уведомлений: WTS_SESSION_LOGON/WTS_SESSION_LOGOFF.

Я думаю, что WTS_SESSION_LOGOFF отправляется только когда фактическая происходит выход из системы, т.е. если пользователь нажимает кнопку Отмена в слове, то Windows, будет знать, что пользователь не вышел из системы на самом деле, и OS не будет посылать WTS_SESSION_LOGOFF (это проверялось, но звучит логично).

Таким образом, вы не имеете дело с материалом WM_ENDSESSION/WM_QUERYENDSESSION.

Recently I wrote some guidance on RDS notifications topic.

+0

Это все еще оставляет проблему сохранения замены рабочего стола, если пользователь инициирует выход из системы, который отменяется. Замена не является надлежащей оболочкой, а просто графическим интерфейсом, который запускается как первое приложение в Citrix. – Pelle

Смежные вопросы