在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+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 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你可能想尝试使用由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);
}