解決しました![解決策]を参照
ご協力いただきありがとうございます。それは大歓迎です!
一言で言えば: SendKeys.Send("^{v}") を使用して Ctrl+V を SSMS 2012 に送信しようとしていますが、機能しません。メモ帳、UltraEdit、Word、Excel、Chrome などで問題なく動作します。Microsoft Visual Studio 2010 でも動作します。
詳細: バックグラウンドで実行されるアプリケーションがあります。キーボード ショートカットを使用して、このアプリケーションはオプションを含むポップアップ ウィンドウを表示します。選択したオプションに応じて、関連するものがクリップボードに保存されます。次に、そのポップアップ ウィンドウを閉じ、新しいフォアグラウンド ウィンドウ (ポップアップを表示する前のウィンドウ) を取得し、SendKeys を使用してクリップボードにあるものを貼り付けようとします。
- SSMSを除く、私が試したほとんどすべてのアプリケーションで動作します
- 手動で Ctrl+V を押すと、クリップボードにあるものを貼り付けます (通常はテキスト)
- GetForegroundWindow で取得したウィンドウのタイトルを表示するコードを追加しましたが、正しい SSMS ウィンドウが表示されます
- 悲しいことに、たまに (非常にまれに)、テキストが SSMS に正しく貼り付けられますが、2 回目以降は機能しません。
- SetForegroundWindow が失敗したという MessageBox が表示されません。
- 単一の SendKey を 3 つの SendKeys に置き換えて "A"、"B"、"C" を送信すると、B と C は送信されますが、A は送信されません。しかし、それは何も変わりませんでした。
- 代わりに 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");
}
}
誰かが助けてくれることを願っています。前もって感謝します!