2011-02-09 2 views
4

У меня есть программа, где мне нужно получить экземпляр SHDocVw.InternetExplorer из работающего процесса IE8. Чтобы получить экземпляр, приведен пример кода ниже. По какой-то причине он не будет работать без Thread.Sleep.Я не хочу использовать Thread.Sleep с SHDocVw.ShellWindows

Browser.HWND вызывает InvalidCastException для всех экземпляров в m_IEFoundBrowsers, если Thread.Sleep удален. При использовании Thread.Sleep он работает для окон IE8.

Кто-нибудь знает, как это сделать, не используя Thread.Sleep? (Я не люблю использовать функцию сна, как правило, это просто раздвигает проблемы в будущем ...)

Пример кода:

InternetExplorer m_IEBrowser = null; 
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass(); 
Thread.Sleep(10);       
foreach (InternetExplorer Browser in m_IEFoundBrowsers) 
{ 
    try 
    { 
     if (Browser.HWND == (int)m_Proc.MainWindowHandle) 
     { 
       m_IEBrowser = Browser; 
       break; 
     } 
     } 
     catch(InvalidCastException ice) 
     { 
      //Do nothing. Browser.HWND could not execute for this item. 
     } 
}   
+0

Что происходит до этого? Вы сами запускаете IE? Для начала нужно время. –

+0

Вы думаете, что 'new ShellWindowsClass()' будет блокироваться, пока он не будет готов к использованию. –

+0

Я сам вставляю IE, и у него достаточно времени для начала. Я попробую еще немного завтра, но похоже, что сон должен появиться после «нового ShellWindowsClass()». Я не так хорош в отношении эффектов отладчика VS, но при запуске кода там и в ожидании в точке останова я получаю ту же проблему, если у меня нет Thread.Sleep. Возможно, отладчик представляет что-то еще, но прямо сейчас мне кажется, что скрыть поток по какой-то причине - это единственное, что разрешает новый ShellWindowsClass(). –

ответ

5

я наткнулся на следующую ссылку, которая кажется для резервного копирования Ганса комментарий: http://weblogs.asp.net/joberg/archive/2005/05/03/405283.aspx

в статье говорится:

Интернет управления Библиотека содержит в «ShellWindowsClass», который б а также набор всех окон оболочки (например: IE) породил через рабочий стол. Этот компонент предоставляет обработчик события «Windows Registered», на который мы направляем , чтобы подключиться. Как только процесс запустит , мы подождем, пока не будет зарегистрировано соответствующее окно , тогда мы собираемся подключить наш контроль над обозревателем к оболочке . Чтобы определить, найдено ли окно , мы перебираем зарегистрированных окон, и мы пытаемся найти , чтобы найти дескриптор, который соответствует дескриптору процесса, который мы ранее запускали. Мы будем использовать примитив синхронизации «ManualResetEvent» , чтобы подождать определенное количество времени для окна для регистрации.

Ожидает, что вы сможете легко сопоставить эти идеи с вашей проблемой.

+0

David - Я постараюсь сделать что-то со статьей, которую вы нашли завтра. Это выглядит многообещающе. Я опубликую результаты. –

+0

@user Удачи! –

+0

Эта статья сделала трюк. Благодаря! Я покажу модификацию не в той статье, которая мне нужна в ответной статье. –

2

Статья, опубликованная Дэвидом, решила проблему. При первом запуске кода в моей программе он работает, как описано в статье. Но если я выйду из программы, оставьте открытый IE8 открытым, снова откройте мою программу, затем метод windows_WindowRegistered получит проблемы с InvalidCastExceptions. Обработка этих исключений, как показано ниже, заставляла ее работать по мере необходимости.

Пример кода:

private void windows_WindowRegistered(int lCookie) 
{ 
    if (process == null) 
     return; // This wasn't our window for sure 

    for (int i = 0; i < windows.Count; i++) 
    { 
     try 
     { 
      InternetExplorerLibrary.InternetExplorer ShellWindow = windows.Item(i) as InternetExplorerLibrary.InternetExplorer; 
      if (ShellWindow != null) 
      { 
       IntPtr tmpHWND = (IntPtr)ShellWindow.HWND; 
       if (tmpHWND == process.MainWindowHandle) 
       { 
        IE = ShellWindow; 
        waitForRegister.Set(); // Signal the constructor that it is safe to go on now. 

        return; 

       } 
      } 
     } 
     catch (InvalidCastException ice) 
     { 
      //Do nothing. Browser.HWND could not execute for this item. 
     } 
    } 
} 
+0

+1 Спасибо, что воспользовались преимуществами других читателей. И у вас теперь достаточно репутации, чтобы выжить! –

Смежные вопросы