О, боже, этот вопрос возникает так много раз, и я всегда пишу что-то вроде: Но, немного взломав, вы можете создать свой собственный, основываясь на оригинальном классе DialogWatcher (от: Как использовать watin с контролем WebBrowser? ), поэтому я покопался в исходном коде, чтобы найти его, и я просто покажу, как я это сделал. Может быть, он не идеален, но работает, и у меня не было с этим проблем.
- Создание
FormDialogWatcher
класса путем копирования оригинала DialogWatcher
, изменения имени класса, пространства имен и т. Д.
Я удалил следующие поля и методы из исходного класса. Это, вероятно, не нужно, но вы, вероятно, будете использовать только один экземпляр WebBrowser
controll, поэтому вам не нужен этот код, и я не уверен, будет ли он работать должным образом после изменений, не удаляя его. Удалить:
private static IList<DialogWatcher> dialogWatchers
public static DialogWatcher GetDialogWatcher(IntPtr mainWindowHwnd)
public static DialogWatcher GetDialogWatcherFromCache(IntPtr mainWindowHwnd)
public static void CleanupDialogWatcherCache()
public void IncreaseReferenceCount()
public void DecreaseReferenceCount()
public int ReferenceCount { get; private set; }
private bool IsWindowOfIexploreProcess(Window window)
В Start()
метод замените это:
if (new Window(MainWindowHwnd).Exists())
{
var winEnumerator = new WindowsEnumerator();
var windows = winEnumerator.GetWindows(win => true);
с этим:
var mainWindow = new Window(MainWindowHwnd);
if (mainWindow.Exists())
{
var winEnumerator = new WindowsEnumerator();
var windows = winEnumerator.GetWindows(window => window.ProcessID == mainWindow.ProcessID);
(единственная реальная разница внутри GetWindows
звонок)
В HandleWindow(Window window)
удалить эту строку:
if (!IsWindowOfIexploreProcess(window)) return;
Вот и все! Чтобы запустить его, просто создайте его: new FormDialogWatcher(Handle)
, где Handle
- это просто свойство Form
. Вы, вероятно, можете создать его после создания объекта IE
в своем примере кода (LOL, я только что выяснил, что речь идет о моем псевдониме :)) - Form_Load
или что-то подобное. Он начнется немедленно (см. Конструктор) и основной цикл прекратится после того, как окно перестанет существовать.
РЕДАКТИРОВАТЬ : Имейте в виду, что если вы установите этот класс (или настройки WatiN) для закрытия необработанных диалогов, то даже ваш MessageBox.Show
будет закрыт:)
РЕДАКТИРОВАТЬ 2 (важно!) : Все вышеприведенное объяснение связано с оригинальным DialogWatcher
классом, взятым из магистрали WatiN SVN ревизия 1056 . Прямая ссылка на эту редакцию и файл: http://watin.svn.sourceforge.net/viewvc/watin/trunk/src/Core/DialogHandlers/DialogWatcher.cs?revision=1056&content-type=text/plain&pathrev=1056