2

現在実行中のアプリケーションAに特定の入力Iを取得したときにポップアップを表示したいと考えています。ポップアップのダイアログの結果に応じて、 SendKeys クラスを使用してキーストロークを送信することにより、アプリケーションAの現在のテキスト ボックスにテキストを変更したいと考えています。現在、低レベルのキーボード フックを使用しています。つまり、アプリケーションA が処理する前にキーダウン イベントを取得できました。この場合、入力されたテキストの最後の部分がAのテキスト ボックスに表示される前に、ポップアップが表示されます。Popup がフォーカスを取得し、テキストのこの部分がAに到達するのを防ぎます。

たとえば、lolキーワードを検索しています。ユーザーがメモ帳を開き、「lol」と入力します。この時点で、私のアプリケーションはポップアップウィンドウ「Press Enter to add blahblahblah text」を表示するはずです。ポップアップウィンドウがフォアグラウンドになりました。ユーザーが Enter キーを押すと、アプリケーションはこのダイアログを閉じ、メモ帳を再びフォアグラウンドに戻し、キーストロークとして「blahblahblah」をシステムに送信します。

メモ帳ではすべて正常に動作しますが、ターゲット アプリケーション/システムの動作が遅く、時々応答しない場合はどうすればよいでしょうか? 次のテスト アプリを検討します。

public Form1()
{
    InitializeComponent();
    timer1.Enabled = true;
    timer1.Interval = 2000;
}

private void timer1_Tick(object sender, EventArgs e)
{
    System.Threading.Thread.CurrentThread.Join(1900);
}

このフォームにはテキスト ボックスが含まれており、その UI スレッドは 95% の時間スリープしています。2秒ごとにキーボード入力を処理します。そのため、ユーザーがそのようなウィンドウでlolを入力すると、私のアプリケーションは、テキスト ボックスに "lol" テキストが表示される前にポップアップを表示する可能性が高くなります。

すべてのテキストがターゲット アプリAに到達する前にポップアップを表示したくありません。一部のプロセスがすべてのキーボード入力を消費した瞬間を取得する方法を提案できますか?

SendKeys.Flush() が機能しません。他の目的のために設計された Process.WaitForInputIdle() も同様です。SendMessage を介して WM_ACTIVATE メッセージをターゲット アプリに送信しようとしましたが、それはまさに私が探しているものだと思ったからです。

SendMessage 関数は、指定されたウィンドウのウィンドウ プロシージャを呼び出し、ウィンドウ プロシージャがメッセージを処理するまで戻りません。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx

User32.SendMessage(activeWindow, WM_ACTIVATE, WA_ACTIVE, 0)

呼び出しは 0 を返しますが、必要な一時停止を作成せず、ポップアップがテキストの前に表示されます。

前もって感謝します。

4

0 に答える 0