Сейчас на форуме: tyns777, zds, JustLife, 2nd (+4 невидимых)

 eXeL@B —› Программирование —› EnumWindows + SendMessage(WM_CLOSE...) = не работает
Посл.ответ Сообщение

Ранг: 10.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 05 мая 2009 21:52
· Личное сообщение · #1

Эта тема уже есть на WASM'е.

Вчера тренировался по работе с GUI и сообщениями в VC 6 - решил написать программку, посылающую сообщения нужным окнам.
Эта программа перечисляет верхние окна функцией EnumWindows, а callback-функция записывает полученный HWND в динамический массив, попутно увеличивая его размер по мере необходимости. В дальнейшем все HWND берутся только из этого массива.
Потом интерфейс программы получает адрес этого массива и добавляет в ListBox заголовки этих окон пока в массиве не встретится NULL. В результате ListBox наполнен заголовками текущих Top-окон в системе. При выборе элемента списка в один из Edit'ов записывается HWND, взятый из массива.
Кнопка Update обновляет список путем удаления всех элементов из списка и создания динамического массива заново. Кнопка Close посылает выбранному окну сообщение WM_CLOSE.

При получении WM_CLOSE окно должно закрыться, но этого не происходит. Путем использования FindWindow выясняется что HWND выбранного окна и его значение в массиве не совпадают, почему окно и не закрывается.
ВОПРОС: Почему HWND в массиве уже не совпадает с реальным, хотя если нажать кнопку Update, то значения остаются те же?

Сейчас программа работает, но за счет того что используется ф-я FindWindow, а зн-е из массива не берется. А ведь содержимое ListBox'а может изменить любой процесс, поэтому на его содержимое полагаться нельзя!

И еще. Замечено изменения поведения программы в релизной и дебагной версии. Хотя во всех используется UNICODE и _UNICODE, при инициализации релизной программы в ListBox'е очень мало содержимого, а если нажать Update, то строк становится больше. Иногда наблюдается повторение каждого заголовка в списке при нажатии на Update. И еще при запущенном Spyxx программа также выводит в LisBox другие значения.
Один раз где-то по середине процесса разработки программы она падала при обычном запуске из-за ошибки доступа, а при запущенном Spyxx - нормально запускалась, правда ListBox был полностью пустой.

88bd_05.05.2009_CRACKLAB.rU.tgz - WindowWork.rar



Ранг: 10.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 05 мая 2009 21:56
· Личное сообщение · #2

Кстати - заметил что если WM_CLOSE послать окну с заголовком "Program Manager", то появится диалог завершения работы. Интересно - что надо сделать чтобы появился диалог выхода из учетной записи?



Ранг: 51.8 (постоянный), 58thx
Активность: 0.03=0.03
Статус: Участник

Создано: 06 мая 2009 05:19
· Личное сообщение · #3

AndreyMust19 пишет:
ВОПРОС: Почему HWND в массиве уже не совпадает с реальным, хотя если нажать кнопку Update, то значения остаются те же?

Всё совпадает. Порядок строк в списке не совпадает с порядком HWND-ов в массиве, потому что в стиле списка стоит автосортировка. LBS_SORT надо убрать.
AndreyMust19 пишет:
Интересно - что надо сделать чтобы появился диалог выхода из учетной записи?

MSDN в помощь.



Ранг: 10.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 06 мая 2009 09:35
· Личное сообщение · #4

Спасибо, Prober, я уже понял это сегодня утром. Тему закрываю.
P.S. Как же все-таки плохо, когда любая программа может послать сообщение чему угодно, тем самым закрыть все окна, удалив все элементы управления, оставив диалог полностью пустым или заменив текст на кнопках.


 eXeL@B —› Программирование —› EnumWindows + SendMessage(WM_CLOSE...) = не работает
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати