Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PostQuitMessage не срабатывает после отключения от сессии и последующего подключения,

7
01 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
если была вызвана MessageBox
Создал [ATTACH]5208[/ATTACH],который записывает в журнал события следующего плана:отключение/подключение к сессии,раз-/блокировка системы,вход/выход пользователя(другого)+время возникновения события.Вроде бы всё хорошо,но заметил один странный глюк–если вызвать сообщение с информацией о состоянии наблюдения,а потом сделать TSDiscon,то при последующем входе в пользователя программа не завершается с помощью горячих клавиш.Отлаживал–PostQuitMessage просто вызывается,и всё.Причём,стоит только вызвать MessageBox снова,и программа завершается(причём от сообщения только звук,само окно не видно)
Из-за чего возникает такая проблема и как с ней справиться?

Горячие клавиши:<Пуск>+Alt+
• Q–завершение программы
• A–смена режима наблюдения(вкл/выкл)
• S–вывод информации о текущем режиме

P.S.Буду рад замечаниям по коду,где что подправить
7
07 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Т.к. никто вроде помогать не желает,приведу свои изыскания.На самом деле они не такие уж и интересные,но хоть что-то
Насколько я понял,из-за того,что создаётся окно не то что невидимое,а вообще message-only,каким-то образом после вызова MessageBox PostQuitMessage перестаёт попадать в очередь сообщений основного окна.И всё,пипец.При нажатии <Пуск>+Alt+Q PostQuitMessage благополучно срабатывает,но в цикле обработки сообщений никаких изменений не наблюдается(GetMessage 0 не возвращает).Если кто-то может подсказать,как исправить проблему иным способом,буду рад

(а так–сделал костыль…или единственное возможное решение.Через DestroyWindow.Проект прилагаю)
278
07 июля 2011 года
Alexander92
1.1K / / 04.08.2008
[QUOTE=@pixo $oft]если вызвать сообщение с информацией о состоянии наблюдения,а потом сделать TSDiscon[/QUOTE]
Что вы имеете в виду? Завершение текущего сеанса?

P.S. Просмотрел код, сразу маленький нюанс: в основном цикле лучше функции GetMessage() не скармливать конкретное окно, а писать NULL, дабы мониторить все окна, принадлежащие потоку. Включая диалоги и все прочее.
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Alexander92
Что вы имеете в виду? Завершение текущего сеанса?

Завершением сеанса оно является лишь для терминальной сессии,для обычного пользователя эта команда вызывает эффект,аналогичный простой блокировке(но какое-то отличие всё же есть,не просто так же экран отключается и включается)

Цитата: Alexander92
маленький нюанс: в основном цикле лучше функции GetMessage() не скармливать конкретное окно, а писать NULL, дабы мониторить все окна, принадлежащие потоку. Включая диалоги и все прочее.

Учту.В принципе,хуже от этого быть не должно
Что странно–ведь окно после MessageBox уничтожается,т.е. по идее ловить сообщения не может.Однако,это не так

Кстати,необязательно даже вызывать TSDiscon,можно просто заблокировать рабочую станцию

278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Я понял. Собственно, главное, что я хотел узнать, - как смоделировать описанную ошибку, вчера у меня это не получилось. Сейчас еще посмотрю, если что-то накопаю - отпишусь.
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
А ты 1ю версию смотрел?Если что,могу повторно и детально расписать,как что
278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Как раз первую сейчас и смотрю, ты ж сам писал, что вторая - это костыль. Вот что я делаю (если неправильно понял - поправь):
1. Запускаю программулину.
2. Жму Win+Alt+S, получаю MessageBox с текстом "Наблюдение включено".
3. Блокирую систему, ввожу пароль, вхожу обратно.
4. Пытаюсь закрыть программулину по Win+Alt+Q.

Или я где-то неправ? Просто при такой последовательности, как я описал, багов не увидел пока.
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Ага,насчёт блокировки я прогадал,значит.Попробуй TSDiscon(если у тебя XP,в версиях старше её почему-то убрали)

(проверил,просто блокировка отрабатывает нормально)
278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Бр-бр-бр... Если хочешь посмеяться - вариант с TSDiscon у меня тоже отрабатывает на 100%. Перебрал все возможные варианты, все идеально чисто. Можешь расписать по пунктам, как ты получаешь свою ошибку?
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Да так и получаю:) Но нашёл решение,воспользовавшись твоим советом–написал GetMessage(&msg,0,0,0),и после TSDiscon всё нормально завершилось
(может,ты в моей программе тоже исправил hWnd на 0?)

Но по пунктам распишу:
• Запуск
• …+S&#8594;OK
• TSDiscon&#8594;logon
• …+Q&#8594;no effect!
278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Есть, поймал ошибку. Фокус в том, что почему-то она не проявляется в дебаг-сборке, только в релизе. Сейчас посмотрю повнимательнее, раз уж поймал...

[QUOTE=@pixo $oft](может,ты в моей программе тоже исправил hWnd на 0?)[/QUOTE]
Нет, я вообще ничего не ме менял. Специально на всякий случай еще раз скачал первый вариант. Кстати, ты в какой студии писал? Просто я запустил в 2008-й, она мне рассказала, что проект создан в более ранней.
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Интересное дело,у меня в дебаге проявлялось.И в среде,и вживую

В принципе,результатами я доволен(уже чисто спортивный интерес,ну и чтоб в будущем с таким не сталкиваться),выкладываю последнюю версию.Единственное,что не радует–когда запускаешь проект не из среды и потом переключаешься между разными окнами,MB от него «Наблюдение включено/выключено» вылезает в фоне(т.е. подо всеми окнами).Указание hwnd в 1м параметре не помогло.Хотелось бы устранить сей недостаток
278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Боюсь, что от этого недостатка ты не избавишься до тех пор, пока у тебя основное окно HWND_MESSAGE. MessageBox() ведь имеет z-order, как у родительского окна + 1, если правильно помню. Я сходу вижу только два варианта: либо делай собственный диалог вместо месседжбокса и вручную делай его HWND_TOPMOST, либо основное окно делай не HWND_MESSAGE, а просто нулевого размера, и клади его на верхушку (первый вариант лучше, мне сдается).

Upd: там ошибка даже еще веселее, чем ты описал изначально. Последовательность действий
1) запустить;
2) Win+Alt+S и нажать OK;
3) TSDiscon;
4) Win+Alt+Q
действительно приводила к глюку. В то же время, если во втором пункте оставить месседжбокс висеть, то в четвертом пункте программулина прекрасно закрывается. :)

Да, еще момент. Сколько видел WinAPI-приложений, обычно из WinMain() возвращают не 0, а msg.wParam (содержащий код возврата после получения WM_QUIT).
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Да ну,нафиг ещё диалоги лепить:) Всё по минимуму
А если сделать окно не HWND_MESSAGE,а просто скрытое,поможет?

(HWND_TOPMOST поверх всех окон же.Если брать конечного пользователя,ему это может мешать.Есть ли иные способы выноса окна на поверхность?)

Upd:заметил вопрос про студию.Писал в 2005й(куда ж ещё раньше:))

И по поводу возвращения значений:это по поводу того,что в PQM передаётся?Вообще это чистая формальность,для тех,кто будет анализировать результат выполнения приложения.Мне оно не надо,так что вот так &#9786;
278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Поборол, кажись. :) Вылечилось добавлением строки
 
Код:
ShowWindow(hWnd, SW_SHOW);

после создания окна. Визуально-то ему по барабану, а формально окно получилось видимое, соответственно, MessageBox отрисовывается наверху. Единственное (не могу пока понять, почему), в твоем проекте не определена константа SW_SHOW, я вручную прописал
 
Код:
ShowWindow(hWnd, 5);
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Alexander92
Единственное (не могу пока понять, почему), в твоем проекте не определена константа SW_SHOW

А я знаю,почему!:D
Это всё из-за #define NOSHOWWINDOW,я этих дефайнов напихал в начале тучу типа для оптимизации компиляции

278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Ну я примерно туда и думал, поленился их все прочитать. :D Сработало?
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Да,всё работает нормально,спасибо.А hwnd в вызове MB сильно влияет?
Для видимых окон,ясен перец,это указатель на их модальность.А в моём случае,кажется,на hwnd пофиг
278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Хочешь посмеяться? Я чувствовал, что мы оба делаем костыли, но не мог доказать. Идем в MSDN:
Цитата:

MB_SYSTEMMODAL
the message box has the WS_EX_TOPMOST style.



Итого, решение прозаично:

 
Код:
MessageBox(NULL, _T("Text"), _T("Caption"), MB_ICONINFORMATION | MB_SYSTEMMODAL);

И никаких костылей. :)
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Нет,это всё же не то.Предыдущий вариант не особо-то и костыльный,работает так,как надо–и окно активным становится,и поверх всех окон не торчит.Кстати,при MB_SYSTEMMODAL у него ещё и значок в заголовке(но это уже мелочи)

P.S.Дьжябир-то есть(или QIP-аккаунт)?В конференцию добропожалуй:)

Upd:скорее,тогда уж надо было MB_SETFOREGROUND
278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: @pixo $oft
Нет,это всё же не то.Предыдущий вариант не особо-то и костыльный,работает так,как надо–и окно активным становится,и поверх всех окон не торчит.


Ну как хошь. Я просто, наоборот, ориентировался на topmost, смотри уже, как удобнее.

Цитата: @pixo $oft

А hwnd в вызове MB сильно влияет?
Для видимых окон,ясен перец,это указатель на их модальность.


А я ж потому и предложил сделать окно формально видимым, чтобы диалог был модальным.

Цитата: @pixo $oft

P.S.Дьжябир-то есть(или QIP-аккаунт)?В конференцию добропожалуй:)


Спасибо за приглашение. =) Появлюсь в ближайшее время, как разгребусь с делами чуток.

7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Alexander92
Ну как хошь. Я просто, наоборот, ориентировался на topmost, смотри уже, как удобнее

Не,ну такое мне не надо:) Как написано в MSDN,это нужно только для особо опасных случаев.У меня не такой

Цитата: Alexander92
А я ж потому и предложил сделать окно формально видимым, чтобы диалог был модальным

Кстати,там ещё 2 флага,отвечающих за модальность.Я почитал…и подумал,нафиг дальше заморачиваться &#9786;

Цитата: Alexander92
Спасибо за приглашение. =) Появлюсь в ближайшее время, как разгребусь с делами чуток.

You're welcome!

278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: @pixo $oft
Кстати,там ещё 2 флага,отвечающих за модальность.Я почитал…и подумал,нафиг дальше заморачиваться &#9786;


Ну в принципе, да. Значит, будем считать, что решили проблему.)

Цитата: @pixo $oft

You're welcome!


Thanks.=)

7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Alexander92
Значит, будем считать, что решили проблему)

Вообще не совсем,есть некоторые непонятки с PQM–а именно,почему она себя так ведёт.Впрочем,как я писал выше,это спортивный интерес,а проблема решилась через hWnd&#8594;0
Кстати,эти флаги не помогли,рулит лишь только через ShowWindow

А у тебя 666 сообщений!:D

И вот финальная версия проекта:

278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Из того же "спортивного интереса" продолжил тесты. Оказалось следующее: с вероятностью в 99% утверждаю, что наблюдаемая проблема связана с HWND_MESSAGE-окном. По крайней мере, стоило мне сделать полноценное видимое окно, проблема тут же улетучилась. Более того: в ходе тестов оказалось, что при некотором расположении окон (не готов пока внятно сформулировать, как получить этот результат) ошибки нет даже в первоначальном варианте (без замены hWnd на 0). Продолжение следует...
7
08 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Если интересно продолжение,то мне тоже интересно:) (сам насчёт гипотезы о HWND_MESSAGE,ибо понимаю,для чего оно служит и какие примерно могут быть результаты использования оного)
Я так полагаю,что эксперименты ведутся именно над 1м проектом в чистом виде с учётом только указанных изменений?
278
08 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Говорю ж, продолжение интересно из того же спортивного интереса. :) Пожалуй, немного с выводами поторопился, с видимым окном тоже словил глюк. Пока уверенно могу утверждать только одно: по каким-то причинам оно ведет себя нестабильно, и описанное тобой в первом посте поведение возникает не всегда.

Да, фактически эксперименты ведутся над первым проектом. Я немного отложу до завтра, на выходных еще посмотрю, если что-то накопаю - отпишусь.
278
09 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Раскопал.
[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, т.к. ошибка появлялась еще при многих разных тестах. Чего и следовало ожидать, в принципе.
7
09 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Вообще там написано «will never be received through a window's window procedure»,что логично–ведь условием конца цикла сообщений является возврат GetMessage нуля.Ну и,в случае непоявления MessageBox'ов,ловилось это сообщение циклом нормально
Что некрасиво делать,я уже понял,поэтому проект наконец подрихтован.Спасибо за помощь,и за исследование в том числе!:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог