解决了!请参阅[解决方案]
感谢您的任何帮助,您可以提供。非常感谢!
简而言之:我正在尝试使用 SendKeys.Send("^{v}") 将 Ctrl+V 发送到 SSMS 2012,但它不起作用。它可以与记事本、UltraEdit、Word、Excel、Chrome 一起正常工作,随叫随到。它甚至可以在 Microsoft Visual Studio 2010 中使用。
详细信息:我有一个在后台运行的应用程序。使用键盘快捷键,此应用程序会显示一个带有选项的弹出窗口。根据我选择的选项,它会将与之相关的内容保存到剪贴板中。然后我关闭该弹出窗口,获取新的前景窗口(它应该是我在显示弹出窗口之前拥有的那个)并尝试使用 SendKeys 粘贴剪贴板中的内容。
- 它适用于我尝试使用的几乎所有应用程序,除了 SSMS
- 如果我手动按 Ctrl+V 它会粘贴我在剪贴板中的内容(通常是文本)
- 我添加了一些代码来显示我使用 GetForegroundWindow 获得的窗口的标题,它确实给了我正确的 SSMS 窗口
- 可悲的是,偶尔(很少),文本会正确粘贴到 SSMS 中,但第二次之后就不起作用了。
- 我从来没有收到消息框说 SetForegroundWindow 失败。
- 如果我用 3 个 SendKey 替换单个 SendKey 以发送“A”、“B”和“C”,则发送 B 和 C,但不发送 A。是的,我尝试过使用睡眠,认为它需要时间来编写第一个 SendKey,但这并没有改变任何东西。
- 我确实尝试了 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");
}
}
希望有人可以提供帮助。提前致谢!