На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Найти и закрыть MessageBox
    Как проще всего найти и закрыть мною же вызванный MessageBox (в другом потоке, например)?
    p.s. Надо сделать таймаут для него – суть в этом...
      Я такое ловлю по таймеру через ::FindWindow()... Подробности - только послезавтра, щяс на даче сижу...
          Цитата Shaggy @
          MessageBoxTimeout
          Ооо! :blink: :good: ++
          Но вопрос всё равно актуален, мне интересен процесс поиска окна MessageBox'а!

          Добавлено
          Причём, надо учесть, что окно может быть не Foreground, без заголовка, hWnd=0, и что может быть открыт ещё какой-то другой MessageBox.
          Т.е. FindWindow('#32770', Title) звучит не надёжно...
            Цитата Jin X @
            Причём, надо учесть, что окно может быть не Foreground, без заголовка

            Если не секрет, а почему бы изначально в заголовок не вставлять метку то?
              Потому что я заранее не знаю какой там будет заголовок.

              Добавлено
              Как вариант можно, конечно, вставить в заголовок штук 200 пробелов и 20 random'ных символа, но меня смущают "..." в заголовке :)
              Можно, найдя это окно, сразу убрать эти 220 символов – тоже вариант, конечно, тогда эти "..." не так заметны будут.
              А ещё можно в добавок ко всему вместо этих 220 символов сделать random'ный набор из 10 пробелов и 255-х символов (2^10 = 1024 вариантов вполне достаточно для гарантии, что такого окна больше нигде нет) – это лучше, т.к. есть большая вероятность, что заголовок+10 пробелов не выйдут за границу заголовка.

              Добавлено
              Но мне всё равно почему-то кажется, что это не самый красивый вариант.... :)

              Добавлено
              А ещё прикол в том, что часть заголовка, содержащая текст, подсвечивается... и когда пробелы пропадут, эта подсветка пропадёт. Конечно, может, это и не будет заметно. Но не факт :)
              И ещё можно Hook поставить на создание окна, кстати :)
                Цитата Jin X @
                мне интересен процесс поиска окна MessageBox'а!
                Причём, надо учесть, что окно может быть не Foreground, без заголовка, hWnd=0, и что может быть открыт ещё какой-то другой MessageBox

                Тогда остается единственный критерий того, что это твое окно - id процесса и\или потока окна. Отсюда варианты - GetGuiThreadInfo, EnumThreadWindows или EnumWindows с проверкой принадлежности окна по GetWindowThreadProcessID
                  Цитата leo @
                  Тогда остается единственный критерий того, что это твое окно - id процесса и\или потока окна.
                  А при вызове MessageBox'а его окно будет принадлежать моего процессу?
                    Позор, такой большой, а маны не читаешь:
                    Цитата
                    int WINAPI MessageBox(
                    _In_opt_ HWND hWnd,
                    _In_opt_ LPCTSTR lpText,
                    _In_opt_ LPCTSTR lpCaption,
                    _In_ UINT uType
                    );

                    Parameters

                    hWnd [in, optional]

                    Type: HWND

                    A handle to the owner window of the message box to be created. If this parameter is NULL, the message box has no owner window.
                    Сообщение отредактировано: Gonarh -
                      Цитата Gonarh @
                      If this parameter is NULL, the message box has no owner window

                      :whistle:
                      MessageBox(0, pMsgBuf, 'Error', 0);
                        Ну и ССЗБ, передавай хендл и будет тебе счастье.
                          Руслан, в точку! :good:
                          Gonarh, в том-то и дело, что MessageBox может вызываться без хэндла окна. А знаешь почему, например? Потому что приложение может не иметь окон в принципе! Например, оно консольное... ну или просто без окон...
                            Цитата Jin X @
                            А при вызове MessageBox'а его окно будет принадлежать моего процессу?

                            Конечно, и тому потоку, из которого вызвана функция MessageBox
                              Ну тогда EnumThreadWindows – это вообще самый простой способ! :good:
                                Если MessageBox - твой собственный, то можно создавать списки окон, принадлежащих текущему потоку, до и после создания мессаги, и таким образом находить хендл.
                                Что-то вроде такого:

                                Любой поток
                                ExpandedWrap disabled
                                  func MyMsgBox(...)
                                    создать event
                                    отправить потоку-контролеру сообщение-сигнал, что будем создавать окно (WParam = hEvent, LParam = CurrentThreadID)
                                    ждать hEvent
                                    WinApi.MsgBox()
                                    закрыть hEvent

                                Поток-контролер
                                ExpandedWrap disabled
                                  proc Execute
                                    крутить цикл выборки сообщений
                                    на сообщение-сигнал:
                                      получить список всех окон, принадлежащих потоку Msg.LParam
                                      взвести событие Msg.WParam
                                      повторить в течение N мсек:
                                        получить список всех окон, принадлежащих потоку Msg.LParam
                                        сравнить со старым списком
                                        появившийся хэндл = хэндлу мессаги


                                Слабость данного метода в цикле "повторить в течение N мсек". Вызов WinApi.MsgBox может закончиться неудачей, и за это время поток может создать другое окно. Для избежания можно проверять результат WinApi.MsgBox и, например, ждать некоторое время в случае ошибки.
                                  Можно просто повесить хук на создание окна и не париться. Из хука вызывать EnumThreadWindows, чтобы получить хэндл (там будет только 1 окно, собственно).
                                    Цитата Jin X @
                                    там будет только 1 окно, собственно

                                    С чего бы?
                                      С того, что тред создаётся специально для вызова MessageBox'а.
                                        А, если это ты контролируешь, то да.
                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                        0 пользователей:


                                        Рейтинг@Mail.ru
                                        [ Script execution time: 0,0761 ]   [ 17 queries used ]   [ Generated: 29.03.24, 07:14 GMT ]