Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2012, 12:00   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Восклицание Спонтанные зависания при EnumWindows, как избавиться, и что использовать Send/PostMessage

Доброго времени суток!

Имеется код:
Код:
function EnumProc(aHWND: HWND; alParam: LPARAM): LongBool; stdcall;
var
  P: PWindowSEarchInfo;
  sClass, sTitle: string;
begin
  P := PWindowSearchInfo(alParam);
  if IsWindowVisible(aHWND) and IsWindowEnabled(aHWND) and not IsIconic(aHWND) and not P.swFound then
  begin
    //Класс
    if not (p.swClass = EmptyStr) then
    begin
      sClass := ReturnControlClass(aHWND);
      if Pos(LowerCase(p.swClass), LowerCase(sClass)) > 0 then
      begin
        p.WindowInfo.wClass := sClass;
        p.WindowInfo.wTitle := ReturnControlText(aHWND);
        p.WindowInfo.wHandle := aHWND;
      end
      else
        Exit;
    end;

    //Заголовок
    if not (p.swTitle = EmptyStr) then
    begin
      sTitle := ReturnControlText(aHWND);
      if Pos(LowerCase(p.swTitle), LowerCase(sTitle)) > 0 then
      begin
        p.WindowInfo.wClass := ReturnControlClass(aHWND);
        p.WindowInfo.wTitle := sTitle;
        p.WindowInfo.wHandle := aHWND;
      end
      else
        Exit;
    end;

    P.swFound := True;

    //Поиск внутри окна компонентов
    if not (p.swText = EmptyStr) or not (p.swButtonClass = EmptyStr) or not
      (p.swButtonText = EmptyStr) then
    begin
      EnumChildWindows(aHWND, @EnumChildProc, Integer(P))
    end;
  end;
end;
Работает на ура.

Единственное - это виснет на SEndMessage'ах, что совсем не радует.

Думаю использовать PostMessage, что думаете вы?

на Post система может и не ответить, а ответ нужен..

Как быть?

Последний раз редактировалось Человек_Борща; 16.03.2012 в 12:02.
Человек_Борща вне форума Ответить с цитированием
Старый 16.03.2012, 12:38   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если нужен ответ то только SendMessage.
хотя есть аналоги, например SendMessageCallback или SendMessageTimeout.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.03.2012, 22:57   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Дело не в том, нужен или не нужен. Ответ-то мне нужен всеравно.
Энумирация вешает программу если сообщение послано к мертвому окну.

А вот за SendMessageTimeout огромная благодарность.
Человек_Борща вне форума Ответить с цитированием
Старый 17.03.2012, 00:10   #4
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

вся проблема в инзначально неправильном подходе. во время перебора окон в колбэке вообще не рекомендуется посылать какие-либо сообщения.

было бы намного правильнее вызвать EnumWindows, сформировать список окон и потом с ним уже работать как душа пожелает.
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 21.03.2012, 01:37   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Rock-n-Rolla,
Цитата:
колбэке вообще не рекомендуется посылать какие-либо сообщения.
Можно каких-нибудь ссылочек на оф. источник информации?

Цитата:
было бы намного правильнее вызвать EnumWindows, сформировать список окон и потом с ним уже работать как душа пожелает.
У меня все работает так:
-EnumWindows
--EnumChildWindows

Практика показала, что делать все "на лету" куда быстрее, как по времени так и по ресурсам.


Далее...
Пепел Феникса, пожалуйста, можно обьяснить, какие флаги функции SendMessageTimeout, мне использовать в моей ситуации?

Нагуглил как оф. источник, так и ссылку на русском

Не не втфыкаю, что к чему...
Человек_Борща вне форума Ответить с цитированием
Старый 21.03.2012, 09:02   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

пожалуй SMTO_BLOCK, чтоб ждать ответа прямо сейчас.
и наверно SMTO_ERRORONEXIT.

еще SMTO_ABORTIFHUNG может быть полезен.
Цитата:
Нагуглил как оф. источник
а я ссылку зачем давал?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 21.03.2012 в 09:16.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.03.2012, 12:47   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Взял в оборот SMTO_BLOCK

Фопрос решен.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
неполадки при исп. EnumWindows chertovich Win Api 3 24.12.2011 05:53
Что значит эта ошибка в Си и как от неё избавиться verling Общие вопросы C/C++ 3 16.10.2010 11:52
Send и PostMessage Alex Cones Общие вопросы Delphi 5 13.09.2010 19:48
Как избавиться от щелчков при синтезировании мелодий? ArcaN0id Мультимедиа в Delphi 6 22.06.2009 03:02
Как избавиться от зависания приложения при выполнении длительных операциях Des Общие вопросы Delphi 15 30.04.2009 02:05