2

アクティブ化したアプリケーションにキーを送信するvb.netアプリケーションを作成しようとしていますが、私のような初心者のために、テキストボックスで使い始めました。しかし、私の問題は、開始ボタンをクリックして送信キーを開始した後、アプリケーションがハングすることです。ここに私のコードがあります。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Button1.Text = "Start" Then
            Button1.Text = "Stop"
            TextBox1.Focus()
            Do While Button1.Text <> "Start"
                SendKeys.Send("{a}")
                Thread.Sleep(1000)
            Loop
        Else
            Button1.Text = "Start"
        End If
    End Sub

したがって、ボタン1を押すと、テキストが「停止」に変わり、テキストボックス1に焦点が当てられ、停止を押すまでループとキーの送信が行われます。しかし、私は運がありません。誰かが私を助けて、アクティブなウィンドウを変更してsendkeysまたはキーストロークを続けても機能するコードを追加してくれることを願っています. どうも

4

2 に答える 2

1

ハングしている理由は、これらすべてを 1 つのスレッド内で実行しているためです。クリックが発生すると、上記のコードが 1 つのスレッド内でトリガーされます。ループに入ると、Whileキーを送信し、スレッド全体を 1 秒間スリープさせてから、ループ条件がまだ true であるため、再びループします。

代わりに、1000ミリ秒ごとに実行されるタイマーを設定し、そのタイマー関数に次のコードのようなものを入れることをお勧めします。

If Button1.Text <> "Start" Then
    SendKeys.Send("{a}")
End If

次に、ボタン クリック コードをより単純なものに変更します。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Button1.Text = "Start" Then
            Button1.Text = "Stop"
            TextBox1.Focus()
        Else
            Button1.Text = "Start"
        End If
End Sub

これは、2 つの異なるイベント ハンドラーを使用するように変更されています。1 つはボタン クリック用で、もう 1 つは毎回起動するタイマー用であり、適切なことが発生したときにそれぞれが呼び出されます。それ以外の時間は、プログラムは何もしていません。リソースを無駄にしないので、これは良いことです。

それは理にかなっていますか?

于 2013-03-27T23:56:49.483 に答える
0

この質問には、MSDN の記事へのリンクといくつかのサンプル コードを含む回答があります。それはあなたが望むことをするべきです(長期的に)。「なぜぶら下がっているのか」という質問に答える短期的には、テキストフィールドの値をチェックする単一のスレッドでループしているため、「ぶら下がっている」ことになります。

于 2013-03-27T23:56:53.970 に答える