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 に正しく貼り付けられますが、2 回目以降は機能しません。
  5. SetForegroundWindow が失敗したという MessageBox が表示されません。
  6. 単一の SendKey を 3 つの SendKeys に置き換えて "A"、"B"、"C" を送信すると、B と C は送信されますが、A は送信されません。しかし、それは何も変わりませんでした。
  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