2013-06-05 212 views
2

解决!请参阅[SOLUTION]C#SendKeys和Microsoft SQL Server Management Studio 2012(SSMS)

感谢您提供任何帮助。非常感谢!

简而言之:我试图使用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. 我永远不会让MessageBox说SetForegroundWindow失败。
  6. 如果我用3个SendKeys替换单个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"); 
     } 
    } 

希望有人可以提供帮助。 在此先感谢!

+0

唉...我刚想出一个“解决方案”。由于第一个发送密钥似乎没有在SSMS上注册,我添加了一个无用的“SendKeys.Send(”{F14}“);”在我的Ctrl + V之前。我的文本现在正确地粘贴在SSMS中,而在记事本中F14键不会做任何好的事情。我开始使用{LEFT},但我改变了记事本和UltraEdit中的行,所以我选择了F14。 – Vinster

回答

0

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

... SendKeys类是容易计时问题,其中一些开发商不得不解决。更新的实现仍然易受时间问题的影响,但速度稍快,可能需要更改解决方法。 SendKeys类尝试首先使用先前的实现,如果失败,则使用新的实现。因此,SendKeys类可能在不同的操作系统上表现不同。此外,SendKeys类使用新的实现时,SendWait方法不会等待邮件发送到另一个进程时处理。 ...

相关问题