PostQuitMessage не срабатывает после отключения от сессии и последующего подключения,
Создал [ATTACH]5208[/ATTACH],который записывает в журнал события следующего плана:отключение/подключение к сессии,раз-/блокировка системы,вход/выход пользователя(другого)+время возникновения события.Вроде бы всё хорошо,но заметил один странный глюк–если вызвать сообщение с информацией о состоянии наблюдения,а потом сделать TSDiscon,то при последующем входе в пользователя программа не завершается с помощью горячих клавиш.Отлаживал–PostQuitMessage просто вызывается,и всё.Причём,стоит только вызвать MessageBox снова,и программа завершается(причём от сообщения только звук,само окно не видно)
Из-за чего возникает такая проблема и как с ней справиться?
Горячие клавиши:<Пуск>+Alt+
• Q–завершение программы
• A–смена режима наблюдения(вкл/выкл)
• S–вывод информации о текущем режиме
P.S.Буду рад замечаниям по коду,где что подправить
Насколько я понял,из-за того,что создаётся окно не то что невидимое,а вообще message-only,каким-то образом после вызова MessageBox PostQuitMessage перестаёт попадать в очередь сообщений основного окна.И всё,пипец.При нажатии <Пуск>+Alt+Q PostQuitMessage благополучно срабатывает,но в цикле обработки сообщений никаких изменений не наблюдается(GetMessage 0 не возвращает).Если кто-то может подсказать,как исправить проблему иным способом,буду рад
(а так–сделал костыль…или единственное возможное решение.Через DestroyWindow.Проект прилагаю)
Что вы имеете в виду? Завершение текущего сеанса?
P.S. Просмотрел код, сразу маленький нюанс: в основном цикле лучше функции GetMessage() не скармливать конкретное окно, а писать NULL, дабы мониторить все окна, принадлежащие потоку. Включая диалоги и все прочее.
Завершением сеанса оно является лишь для терминальной сессии,для обычного пользователя эта команда вызывает эффект,аналогичный простой блокировке(но какое-то отличие всё же есть,не просто так же экран отключается и включается)
Учту.В принципе,хуже от этого быть не должно
Что странно–ведь окно после MessageBox уничтожается,т.е. по идее ловить сообщения не может.Однако,это не так
Кстати,необязательно даже вызывать TSDiscon,можно просто заблокировать рабочую станцию
1. Запускаю программулину.
2. Жму Win+Alt+S, получаю MessageBox с текстом "Наблюдение включено".
3. Блокирую систему, ввожу пароль, вхожу обратно.
4. Пытаюсь закрыть программулину по Win+Alt+Q.
Или я где-то неправ? Просто при такой последовательности, как я описал, багов не увидел пока.
(проверил,просто блокировка отрабатывает нормально)
(может,ты в моей программе тоже исправил hWnd на 0?)
Но по пунктам распишу:
• Запуск
• …+S→OK
• TSDiscon→logon
• …+Q→no effect!
[QUOTE=@pixo $oft](может,ты в моей программе тоже исправил hWnd на 0?)[/QUOTE]
Нет, я вообще ничего не ме менял. Специально на всякий случай еще раз скачал первый вариант. Кстати, ты в какой студии писал? Просто я запустил в 2008-й, она мне рассказала, что проект создан в более ранней.
В принципе,результатами я доволен(уже чисто спортивный интерес,ну и чтоб в будущем с таким не сталкиваться),выкладываю последнюю версию.Единственное,что не радует–когда запускаешь проект не из среды и потом переключаешься между разными окнами,MB от него «Наблюдение включено/выключено» вылезает в фоне(т.е. подо всеми окнами).Указание hwnd в 1м параметре не помогло.Хотелось бы устранить сей недостаток
Upd: там ошибка даже еще веселее, чем ты описал изначально. Последовательность действий
1) запустить;
2) Win+Alt+S и нажать OK;
3) TSDiscon;
4) Win+Alt+Q
действительно приводила к глюку. В то же время, если во втором пункте оставить месседжбокс висеть, то в четвертом пункте программулина прекрасно закрывается. :)
Да, еще момент. Сколько видел WinAPI-приложений, обычно из WinMain() возвращают не 0, а msg.wParam (содержащий код возврата после получения WM_QUIT).
А если сделать окно не HWND_MESSAGE,а просто скрытое,поможет?
(HWND_TOPMOST поверх всех окон же.Если брать конечного пользователя,ему это может мешать.Есть ли иные способы выноса окна на поверхность?)
Upd:заметил вопрос про студию.Писал в 2005й(куда ж ещё раньше:))
И по поводу возвращения значений:это по поводу того,что в PQM передаётся?Вообще это чистая формальность,для тех,кто будет анализировать результат выполнения приложения.Мне оно не надо,так что вот так ☺
после создания окна. Визуально-то ему по барабану, а формально окно получилось видимое, соответственно, MessageBox отрисовывается наверху. Единственное (не могу пока понять, почему), в твоем проекте не определена константа SW_SHOW, я вручную прописал
А я знаю,почему!:D
Это всё из-за #define NOSHOWWINDOW,я этих дефайнов напихал в начале тучу типа для оптимизации компиляции
Для видимых окон,ясен перец,это указатель на их модальность.А в моём случае,кажется,на hwnd пофиг
MB_SYSTEMMODAL
the message box has the WS_EX_TOPMOST style.
Итого, решение прозаично:
И никаких костылей. :)
P.S.Дьжябир-то есть(или QIP-аккаунт)?В конференцию добропожалуй:)
Upd:скорее,тогда уж надо было MB_SETFOREGROUND
Ну как хошь. Я просто, наоборот, ориентировался на topmost, смотри уже, как удобнее.
А hwnd в вызове MB сильно влияет?
Для видимых окон,ясен перец,это указатель на их модальность.
А я ж потому и предложил сделать окно формально видимым, чтобы диалог был модальным.
P.S.Дьжябир-то есть(или QIP-аккаунт)?В конференцию добропожалуй:)
Спасибо за приглашение. =) Появлюсь в ближайшее время, как разгребусь с делами чуток.
Не,ну такое мне не надо:) Как написано в MSDN,это нужно только для особо опасных случаев.У меня не такой
Кстати,там ещё 2 флага,отвечающих за модальность.Я почитал…и подумал,нафиг дальше заморачиваться ☺
You're welcome!
Ну в принципе, да. Значит, будем считать, что решили проблему.)
You're welcome!
Thanks.=)
Вообще не совсем,есть некоторые непонятки с PQM–а именно,почему она себя так ведёт.Впрочем,как я писал выше,это спортивный интерес,а проблема решилась через hWnd→0
Кстати,эти флаги не помогли,рулит лишь только через ShowWindow
А у тебя 666 сообщений!:D
И вот финальная версия проекта:
Я так полагаю,что эксперименты ведутся именно над 1м проектом в чистом виде с учётом только указанных изменений?
Да, фактически эксперименты ведутся над первым проектом. Я немного отложу до завтра, на выходных еще посмотрю, если что-то накопаю - отпишусь.
[QUOTE=MSDN]
The WM_QUIT message is not associated with a window and therefore will never be received through a window's window procedure.
[/QUOTE]
Следовательно, PostQuitMessage() принципиально кладет сообщение не в очередь окна, а в очередь потока, что возможно поймать, только заменив hWnd на 0 в GetMessage(). Вопрос только, почему иногда оно работало, но однозначно так делать некрасиво. :) Также подтвердилось то, что это никак не связано с TSDiscon, т.к. ошибка появлялась еще при многих разных тестах. Чего и следовало ожидать, в принципе.
Что некрасиво делать,я уже понял,поэтому проект наконец подрихтован.Спасибо за помощь,и за исследование в том числе!:)