【问题标题】:How can i simulate Ctrl+link?如何模拟 Ctrl+link?
【发布时间】:2015-08-05 02:32:29
【问题描述】:

我尝试使用 SnedKeys:

SendKeys.SendWait("^" + "http://*.com/");

我想要做的是模拟 Ctrl+link 的组合,这样它将在后台打开一个新的浏览器选项卡。 来自 chrome 文档:“按 Ctrl 并单击链接在后台的新选项卡中打开链接”

我之前也试过:

SendKeys.Send("^" + "http://*.com/");

但随后出现异常:

无效操作异常

SendKeys 无法在此应用程序中运行,因为该应用程序未处理 Windows 消息。更改应用程序以处理消息,或使用 SendKeys.SendWait 方法。

【问题讨论】:

  • 嗯,InvalidOperationException 是不言自明的。另见*.com/q/8294139

标签: c# .net winforms google-chrome


【解决方案1】:

Ctrl+链接仅在您单击鼠标时才有效。既然要发送按键,就需要使用合适的按键(Ctrl+N,然后是url,然后回车),所以我会这样做:

SendKeys.SendWait("^n");
SendKeys.SendWait("http://www.*.com~");

测试的完整代码(正确激活窗口):

[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

// For Windows Mobile, replace user32.dll with coredll.dll
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);

enum GetWindow_Cmd : uint
{
    GW_HWNDFIRST = 0,
    GW_HWNDLAST = 1,
    GW_HWNDNEXT = 2,
    GW_HWNDPREV = 3,
    GW_OWNER = 4,
    GW_CHILD = 5,
    GW_ENABLEDPOPUP = 6
}

private void button_Click(object sender, RoutedEventArgs e)
{

    IntPtr chromeWindow = FindWindow("Chrome_WidgetWin_1", null);
    IntPtr chrome = GetWindow(chromeWindow, GetWindow_Cmd.GW_HWNDNEXT);

    SetForegroundWindow(chrome);

    SendKeys.SendWait("^n");
    SendKeys.SendWait("http://www.*.com~");
}

注意,我使用here 描述的方法来查找和激活 chrome 窗口。

【讨论】:

  • John 这正在使用 SendKeys,但有什么方法可以隐藏窗口或让它在后台打开它,这样用户就不会看到程序打开了新的 chrome 窗口?我的意思是焦点将停留在我所在的当前窗口上,并且不会移动到新的 chrome 窗口上。
  • 你可以调用 this.Acitvate() 来重新激活你的表单。如果您希望它完全在后台运行,那么您将不得不使用一些 Windows 消息来发送文本,而不是使用 sendkeys。