При использовании System.Windows.Forms.ShowDialog(IWin32Window)
, должен ли я передать в IWin32Window
, представляющем любой дескриптор окна, и иметь ли он модальный относительно этого окна?Должен ли Form.ShowDialog (IWin32Window) работать с любым окном?
Как часть Интернета Проводник 7 расширение Я пытаюсь открыть окно модальное относительно Интернета Проводник вкладчика. Это не текущая выбранная вкладка, но я могу получить hwnd вкладки OK. Однако, когда я передаю это ShowDialog, отображается моя форма, но это не модально ни к чему: я все еще могу делать вещи в Интернете. Проводник, в том числе на вкладке, которая должна быть владельцем. Моя форма показана плавающей над Интернетом Окна проводника, и она остается на вершине, так что это не так, как будто она просто открывается как обычная форма, но она не является корректной.
Используя Spy++, я могу найти свою форму, и ее владелец правильно установлен.
Означает ли это, что что-то пошло не так, или я делаю что-то неправильно? Как сделать свою форму правильной модальной?
FYI, я использую этот класс-обертку для создания IWin32Window
из hwnd
(спасибо Ryan!):
/// <summary>
/// Wrapper class so that we can return an IWin32Window given a hwnd
/// </summary>
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
public WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}
public IntPtr Handle
{
get { return _hwnd; }
}
private IntPtr _hwnd;
}
UPDATE: Использование Internet Explorer, .NET 2.0
UPDATE: Играя еще немного со Spy ++ и ручками, которые он предоставляет, я считаю, что если я использую другой hwnd
, то я могу сделать свое окно модальным на вкладку:
Я использовал вкладку hwnd
, как предложено IWebBrowser2.HWND doc, которое в Spy ++ появляется как класс TabWindowClass
. Он имеет дочерний класс Shell DocObject View
, у которого есть дочерний объект Internet_Explorer_Server. Если я использую hwnd
Internet Explorer_Server
, то он работает правильно, например, когда я нажимаю мышью на других вкладках, Internet Explorer реагирует нормально. Когда я нажимаю мышью на интересующей вкладке, он воспроизводит звук в окнах и ничего не делает.
Я еще не знаю, как программно получить Internet_Explorer_Server hwnd
, но это должно быть возможно.
Кроме того, для чего это стоит, играя с другими ручками окна, я вообще мог сделать свою форму модальной для других приложений и диалогов. Поэтому я думаю, что ответ на мой вопрос - «много, но не все ручки» ... возможно, это зависит от приложения?
ОБНОВЛЕНИЕ: Еще одна заметка: Первоначальная причина, по которой я хотел сделать свою форму модальной для вкладки, а не всего окна, заключается в том, что при открытии MessageBox
из моей формы, передавая форму владельцу, MessageBox
не всегда открыть поверх моей формы. Если новая вкладка «Интернет-проводник» только что была открыта, но не была активной, то MessageBox
будет скрыта, и эта вкладка начнет мигать. Тем не менее, поскольку Интернет Проводник был отключен, и моя мода была открыта модально, переход на эту вкладку невозможен, поэтому Интернет Проводник будет заморожен. Я думал, что открытие моей формы, модальной на вкладку, решит это, но я нашел другое решение, чтобы избежать использования MessageBox
: если я использую вторую форму и ShowDialog(this)
из моей первой формы, тогда вторая форма правильно открывается на фронт.Кажется, что Form.ShowDialog()
работает в некоторых случаях лучше, чем MessageBox.Show()
. Подробнее обсуждается в Problems with modal dialogs and messageboxes.
Какая версия IE вы используете? – JaredPar
ie7 - я должен был сказать. – Rory