2013-06-05 68 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方法不會等待郵件發送到另一個進程時處理。 ...

相關問題