EnumWindows AND SendMessage(WM_CLOSE...) = не работает

Тема в разделе "WASM.WIN32", создана пользователем AndreyMust19, 5 май 2009.

Статус темы:
Закрыта.
  1. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Вчера тренировался по работе с 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 был полностью пустой.
     
  2. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Проблема решена.
    Причина в том, что у ListBox'а был установлен атрибут "Sorted". Выяснилось что все HWND в списке есть, они просто находились не на своих местах. Оказывается, это атрибут Sorted заставлял вставлять строки не друг за другом, а вперемешку. А я только заметил что в списке все заголовки отсортированы по алфавиту!
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    по просьбе автора.
     
Статус темы:
Закрыта.