在IE8中使用SendMessage() c#打开选项卡

本文关键字:选项 IE8 SendMessage | 更新日期: 2023-09-27 17:48:58

在下面的代码中,hWnd是spy++中的"URL句柄":

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

URL是我想要打开的。

我使用相同的方法在IE7中打开选项卡并适当地发送hWnd。我看到这在IE7上工作得很好,而不是在IE8上。在IE8中,它只打开4个标签页,然后IE8停止执行SendMessage请求;但是,我仍然可以按CTRL+TALT+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 Service Pack 3[32位操作系统],IE8版本8.0.6001.18702

所以,它是IE8还是我错过了什么?

UPDATE - 1 我已经更新了代码上的注释,这样代码的功能就很清楚了。上面的代码在IE7上运行得很好(测试最多15个选项卡),但在IE8上只能打开最多4个选项卡。

Update - 2我能够通过使用PostMessage而不是SendMessage来解决这个问题。

<>之前私有无效LaunchURLinIE(IntPtr hWnd, String url, bool newTab = false){StringBuilder ob = new StringBuilder(url);//在URL窗口中输入文本SendMessage(hWnd, WM_SETTEXT, 0, 0);如果(!打开){//按Enter键PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 1);}其他的{//按ALT Enter打开新选项卡PostMessage(hWnd, WM_SYSKEYDOWN, VK_RETURN, 1

在IE8中使用SendMessage() c#打开选项卡

)

你可能想尝试使用由ShDocVw对象暴露的COM,它可以作为一个名为Interop.ShDocVw.dll的.dll找到,它包含一个InternetExplorerClass接口,允许你可靠地执行大多数IE自动化。

我是SWAT http://sourceforge.net/projects/ulti-swat/的贡献者,如果你想要一些好的例子,请随意使用我们的IE自动化源代码,位于SWAT. core/InternetExplorer.cs

实际上你的代码有很多问题,窗口句柄是硬编码的(为什么?)你也只是发送一个键,应用程序通常期望一个keydown/keyup组合或有时一个keydown/keypress/keyup序列,以便它是有效的。您的应用程序使您看起来好像在按住正在发送的键。你可能想使用FindWindow windows API调用,它可以帮助你在运行时为你想要发送消息的窗口找到窗口句柄。

不应该发送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);
}