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,文本将变为“停止”,然后它将专注于 textbox1,然后它将循环和发送键,直到我按下停止。但我没有运气。希望有人可以帮助我并添加一些代码,即使我更改活动窗口并继续发送键或击键也能正常工作。谢谢

4

2 回答 2

1

它挂起的原因是因为您在一个线程中执行所有这些操作。发生点击,上面的代码在单个线程中被触发。当进入While循环时,它发送密钥,然后让整个线程休眠一秒钟,然后再次循环,因为循环条件仍然为真。

我建议你做的是设置一个计时器,每 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

这将更改为使用两种不同的事件处理程序,一种用于按钮单击,另一种用于每次触发计时器,当适当的事情发生时,每个都会被调用。其余时间,您的程序什么都不做,这是一件好事,因为它不会浪费资源。

那有意义吗?

于 2013-03-27T23:56:49.483 回答
0

这个问题的答案带有指向 MSDN 文章的链接以及一些示例代码。它应该做你想做的(长期)。在短期内回答你的“为什么它挂起的问题”,你正在“挂起”,因为你在一个循环中检查文本字段的值。

于 2013-03-27T23:56:53.970 回答