0

私のアプリケーションはSendKeys、入力フィールドをナビゲートしてデータを入力するために使用します(これが最善の方法ではないことはわかっていますが、この制限に対処する必要があります)。ここで、作業中に正しいウィンドウがアクティブになっていることを確認したいと思いますSendKeys

これを確認する1つの方法は、すべてのコマンドの前に現在アクティブなウィンドウを確認することですSendKeys。しかし、それは非常に網羅的に聞こえますか?これを行うためのより良い方法はありますか?よくわかりませんが、マルチスレッドを使って推測していますか?何か案は?

4

4 に答える 4

2

あなたの投稿から私が理解している限り、あなたはあなたのアプリケーションに属していないウィンドウにメッセージを送信します。もしそうなら、私はあなたがすべてのSendKeys呼び出しの前にアクティブなウィンドウをチェックしなければならないのではないかと思います。

于 2009-12-21T18:18:27.733 に答える
0

SendKeysを呼び出す前に、何にフォーカスがあるかを確認するか、OnGotFocusとOnLostFocusを使用して自分でフォーカスしているものを追跡する必要があると思います。マルチスレッドはここでは役に立ちません。GUIスレッドのみがGUIと対話できます。したがって、バックグラウンドスレッドで作業を行うこともできますが、GUIとの対話を委任する必要があります。これを行うには、任意のコントロールまたはウィンドウでBeginInvokeを呼び出すと、適切なスレッドでデリゲートが実行されます。

于 2009-12-21T18:24:51.217 に答える
0

編集:ああ。問題のウィンドウを「所有」していないことを見逃しました。したがって、以下のコードは機能しません。あなたはあなたがしていることをし続ける必要があります。すべてのsendkeysの前にいつでもSetForegroundWindowを呼び出すことができます。

SendKeysを使用するクラスに、問題のフォームからのアクティブ化イベントと非アクティブ化イベントをフックさせます。

internal class SendKeysClass
{
    private bool _canSend;

    public SendKeysClass(Form form)
    {
        form.Activated += (sender, args) => _canSend = true;
        form.Deactivate += (sender, args) => _canSend = false;
    }

    public void Send(string keys)
    {
        if (!_canSend)
            return;

        SendKeys.Send(keys);
    }
}

または、.Net 3.5 / C#3.0を使用していない場合:

internal class SendKeysClass
{
    private bool _canSend;

    public SendKeysClass(Form form)
    {
        form.Activated += OnActivated;
        form.Deactivate += OnDeactivated;
    }

    private void OnDeactivated(object sender, EventArgs e)
    {
        _canSend = false;
    }

    private void OnActivated(object sender, EventArgs e)
    {
        _canSend = true;
    }

    public void Send(string keys)
    {
        if (!_canSend)
            return;

        SendKeys.Send(keys);
    }
}
于 2009-12-22T06:55:09.287 に答える
0

繰り返しのタスクがある場合は、それから関数を作成します...

警告:関数呼び出しなどの正確性をチェックせずにコーディングしただけです。

void MySendKeyFunc(string windowTitle, IEnumerable<Keys> keys)
{
    if(!GetForegroundWindow(windowTitle)
    {
        SetForegroundWindow(windowTitle);
    }
    foreach(Key key in keys)
    {
        SendKeys(key);
    }
} 
于 2009-12-22T08:08:41.173 に答える