Откройте вкладку в IE8 с помощью SendMessage () C # - PullRequest
0 голосов
/ 04 апреля 2011

В этом приведенном ниже коде hWnd - это «URL Handle» в Spy ++:

'WorkerW -> ReBarWindow32 -> Address Band Root -> Edit' 

URL - это то, что я хочу открыть.

Я использую тот же метод, чтобы открывать вкладки в IE7 и отправлять hWnd соответствующим образом. Я вижу, что это нормально работает для IE7, а не для IE8. В IE8 он открывает только 4 вкладки, а затем IE8 прекращает выполнять запрос SendMessage; Тем не менее, я все еще могу нажать CTRL+T ИЛИ ALT+Enter, чтобы открыть новые вкладки в IE8 (поэтому IE8 по-прежнему реагирует).

/**
 * Open URL in IE (open new tab when newTab is true)
 * hWnd is found at runtime 
 **/
private void LaunchURLinIE(IntPtr hWnd, String url, bool newTab = false)
{
    StringBuilder ob = new StringBuilder(url);
    // Type text in the URL window
    SendMessage(hWnd, WM_SETTEXT, 0, ob);
    if (!newTab)
    {   // Press Enter
        SendMessage(hWnd, WM_KEYDOWN, VK_RETURN, 1);
    }
    else
    {   // Press ALT Enter to open new tab
        SendMessage(hWnd, WM_SYSKEYDOWN, VK_RETURN, 1 << 29);
    }
}

Моя среда: Windows XP с пакетом обновления 3 [32-разрядная ОС], IE8 версия 8.0.6001.18702

Итак, IE8 или что-то мне не хватает?

ОБНОВЛЕНИЕ - 1 Я обновил комментарии к коду, чтобы было понятно, что делает код. Приведенный выше код прекрасно работает для IE7 (проверено до 15 вкладок), но в IE8 он открывает только до 4 вкладок.

Обновление - 2 Мне удалось справиться с этим, используя PostMessage вместо SendMessage.

   private void LaunchURLinIE(IntPtr hWnd, String url, bool newTab = false)
    {
        StringBuilder ob = new StringBuilder(url);
        // Type text in the URL window
        SendMessage(hWnd, WM_SETTEXT, 0, ob);
        if (!newTab)
        {   // Press Enter
            PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 1);
        }
        else
        {   // Press ALT Enter to open new tab
            PostMessage(hWnd, WM_SYSKEYDOWN, VK_RETURN, 1 

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

Возможно, вы захотите попробовать использовать COM, предоставляемый объектом ShDocVw, который может быть найден как .dll с именем Interop.ShDocVw.dll. Он содержит интерфейс InternetExplorerClass, который позволяет вам выполнять большинство задач автоматизации IE надежно.

Я участвую в SWAT http://sourceforge.net/projects/ulti-swat/,, если вы хотите, чтобы некоторые хорошие примеры не стеснялись использовать наш источник для автоматизации IE, расположенный в SWAT.Core / InternetExplorer.cs

На самом деле у вас много проблем с кодом, дескрипторы окон жестко закодированы (почему?), И вы отправляете только ключ вниз, приложение обычно ожидает комбинацию keydown / keyup или иногда последовательность keydown / keypress / keyup в порядке чтобы оно было действительным. Ваше приложение создает впечатление, будто вы удерживаете клавиши, которые отправляете. Возможно, вы захотите использовать API-вызов Windows FindWindow, который поможет вам найти дескриптор окна во время выполнения для окна, в которое вы хотите отправлять сообщения.

1 голос
/ 04 апреля 2011

Не следует ли вам также отправить WM_KEYUP?

VK_RETURN?Не уверен, что он делает.Было бы лучше вместо этого послать комбинации клавиш CTRL + T?

  • KEYDOWN CTRL
  • KEYDOWN T
  • KEYUP T
  • KEYUP CTRL

Вы можете найти коды клавиш с помощью KeyInterop.VirtualKeyFromKey.

Я также думаю, что вам нужно использовать PostMessage:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

private const UInt32 WM_KEYDOWN = 0x0100;
private const UInt32 WM_KEYUP = 0x0101;

public static void IENewTab(IntPtr HWnd)
{
    PostMessage(HWnd, WM_KEYDOWN, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.LeftCtrl), 0);
    PostMessage(HWnd, WM_KEYDOWN, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.T), 0);
    PostMessage(HWnd, WM_KEYUP, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.T), 0);
    PostMessage(HWnd, WM_KEYUP, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.LeftCtrl), 0);
}
...