我如何模拟Ctrl +链接?

时间:2015-05-22 23:42:50

标签: c# .net winforms google-chrome

我尝试使用SnedKeys:

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

我想要做的是模拟Ctrl +链接的组合,以便在后台打开一个新的浏览器选项卡。 从chrome文档:"按Ctrl键并单击链接在后台的新选项卡中打开链接"

我先尝试过:

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

然后得到例外:

  

出现InvalidOperationException

     

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

1 个答案:

答案 0 :(得分:2)

Ctrl +链接仅在您单击鼠标时有效。由于你想发送密钥,你需要使用适当的按键(Ctrl + N,然后是url,然后输入),所以我会这样做:

SendKeys.SendWait("^n");
SendKeys.SendWait("http://www.stackoverflow.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.stackoverflow.com~");
}

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