Как известно, модальный диалог, будучи вызван с HWND некого окна блокирует его. А как сделать то же самое "искуственно", желательно на чистом win32 без MFC?
Смотри описание сообщения WM_ENABLE в MSDN Код (Text): xor eax,eax push eax ; не используется, 0 push eax ; 0 == заблокировать / 1 == разблокировать push WM_ENABLE push hWnd ; хэндл окна call SendMessage
G13 То же самое можно сделать вызвав EnableWindow(...). K сожалению, это не совсем то, что нужно. Таким образом можно сделать disable на определенный контроль, но не на все окно с его дочерними подокнами и контролями. Например вызвав EnableWindow для окна IE - ничего не получаем. Окно остается полностью активным. Конечно можно пробежатся по всем подокнам и сделать их неактвными (запоминая состояние каждого дочернего подокна, чтоб потом можно было востановить первоначальное состояние), но это немного муторно, и, очевидно, DoModal имеет другую логику. Когда вызывается DoModal, окно не меняет своего цвета, а когда делаем EnableWindow(..., FALSE), окно становится серым. Полагаю, модальные диалоги что то "подхимичивают" с message loop. Но что?
EnableWindow() просто посылает WM_ENABLE - а IE спокойненько не обрабатывает его - иными словами не вызывает DefWindowProc(). Надо сделать отдельный Message Loop для твоего окна и обрабатывать толко сообщения к твоему HWND, а всё другое игнорировать.
Quantum Не все так просто. Допустим есть IЕ со своим собственным окном и message loop. Я из совершенно другого процесса бросаю на него модальный диалог (MFC делает это на ура). От того, что я в своем процессе запускаю некий message loop ничего не изменится. Как фильтровать сообшения в чужом окне?
Да, hook, наверное, не выход. Тем более много возни. Есть другая идея: Наверняка каждый при разработке GUI приложения допускал ошибку, связанную с зацикливанием. Если этот цикл оказался, например, в обработчике нажатия кнопки. То окно фактически становится disabled. Попробуй вставить в оконную процедуру приложения " jmp $ ".
kush все верно. Но проблема в том, что цикл сообщений не принадлежит моему процессу. Другими словами зациклить его я не могу.
Неужели трудно пропатчить чужой процесс ? (риторический вопрос) 1) Получили адрес оконной процедуры вражеского окна: GetWindowLong(HWND hWnd, GWL_WNDPROC) 2) Ясно, что он вдругом процессе. Но ведь есть магическая функция WriteProcessMemory. Вставляем с ее помощью два байта.
Пропатчить могу. И это совсем не сложно. Но хочется обойтись "конвенциональным" оружием. Если, допустим, я пишу библиотечку которая включает некий аналог модального диалога, то, что мне патчить всех направо и налево? Антивирусы шапками закидают.
Тогда вернемся к хукам. По видимому, это единственный как ты говоришь, "конвенциональный" способ попасть в адресное пространство чужого процесса. Процедура хука WH_CALLWNDPROC будет обрабатывать сообщения к нужному окну до того, как они дойдут до этого окна. Ее код будет находиться в адресном пространстве чужого процесса. Теперь пошлем чужому окну сообщение WM_USER + 100 + X. А в обработчике хука укажем, что по приходу данного сообщения нужно показать модальную форму. Теперь, если этому окну из любого другого процесса придет данное сообщение, то оно будет заблокировано, причем средствами windows. З.Ы: только не говори, что и этот способ не подходит.
katrus Надо было начинать с того, что окно создаётся из другого процесса. Чтобы продублировать модальность достаточно вызвать EnableWindow(hWnd, 0) на родительское окно и создать собственный цикл обработки сообщений - модальные диалоги именно так и поступают. Естественно, из другого процесса не получится перебить цикл сообщений, т.к. у каждого процесса свой цикл. Поэтому модальное окно нужно создавать из процесса IE. Для этого достаточно поместить код создания окна и цикл сообщений в функцию в DLL и заставить IE вызвать эту функцию через хук (SetWindowsHookEx). Никого патчить не нужно.
katrus >Например вызвав EnableWindow для окна IE - ничего не получаем. Окно остается полностью активным. ?? А у меня и EnableWindow, и SetWindowLong+/-WS_DISABLED с IE что хотят, то и делают. Неужели из-за версии ?