2

解决了!请参阅[解决方案]

感谢您的任何帮助,您可以提供。非常感谢!

简而言之:我正在尝试使用 SendKeys.Send("^{v}") 将 Ctrl+V 发送到 SSMS 2012,但它不起作用。它可以与记事本、UltraEdit、Word、Excel、Chrome 一起正常工作,随叫随到。它甚至可以在 Microsoft Visual Studio 2010 中使用。

详细信息:我有一个在后台运行的应用程序。使用键盘快捷键,此应用程序会显示一个带有选项的弹出窗口。根据我选择的选项,它会将与之相关的内容保存到剪贴板中。然后我关闭该弹出窗口,获取新的前景窗口(它应该是我在显示弹出窗口之前拥有的那个)并尝试使用 SendKeys 粘贴剪贴板中的内容。

  1. 它适用于我尝试使用的几乎所有应用程序,除了 SSMS
  2. 如果我手动按 Ctrl+V 它会粘贴我在剪贴板中的内容(通常是文本)
  3. 我添加了一些代码来显示我使用 GetForegroundWindow 获得的窗口的标题,它确实给了我正确的 SSMS 窗口
  4. 可悲的是,偶尔(很少),文本会正确粘贴到 SSMS 中,但第二次之后就不起作用了。
  5. 我从来没有收到消息框说 SetForegroundWindow 失败。
  6. 如果我用 3 个 SendKey 替换单个 SendKey 以发送“A”、“B”和“C”,则发送 B 和 C,但不发送 A。是的,我尝试过使用睡眠,认为它需要时间来编写第一个 SendKey,但这并没有改变任何东西。
  7. 我确实尝试了 SendKeys.SendWait,但没有得到不同的结果。

这是我关闭弹出窗口时的代码

    this.Close();

    IntPtr handle = GetForegroundWindow();

    if (!handle.Equals(IntPtr.Zero))
    {
        if (SetForegroundWindow(handle))
        {
            //Optionnal just to show the window title
            const int nChars = 256;
            StringBuilder Buff = new StringBuilder(nChars);

            if (GetWindowText(handle, Buff, nChars) > 0)
            {
                MessageBox.Show(Buff.ToString());
            }

            //[SOLUTION] Sending a useless key seems to solve my SSMS problem without affecting the other applications.
            SendKeys.Send("{F14}");

            //Sending Ctrl+V
            SendKeys.Send("^{v}");
        }
        else
        {
            MessageBox.Show("SetForegroundWindow failed");
        }
    }

希望有人可以提供帮助。提前致谢!

4

1 回答 1

0

请参阅http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

... SendKeys 类容易受到一些开发人员不得不解决的时间问题的影响。更新后的实现仍然容易受到时序问题的影响,但速度稍快一些,并且可能需要更改变通方法。SendKeys 类首先尝试使用以前的实现,如果失败,则使用新的实现。因此,SendKeys 类在不同操作系统上的行为可能不同。此外,当 SendKeys 类使用新实现时,SendWait 方法将不会等待消息被发送到另一个进程时被处理。...

于 2013-06-06T02:09:26.723 回答