我试图制作一个vb.net应用程序,将sendkeys发送到我激活的任何应用程序,但对于像我这样的初学者,我开始在文本框中使用它。但我的问题是在我点击开始按钮启动发送键后,我的应用程序挂起。所以这是我的代码。
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,然后它将执行循环和发送键,直到我按下停止。但我没有运气。希望有人可以帮助我,并添加一些即使我更改活动窗口并继续发送键或按键的代码。 THX
答案 0 :(得分: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
这正在改为使用两个不同的事件处理程序,一个用于按钮单击,另一个用于每次定时触发,每个事件在适当的事情发生时被调用。其余的时间,你的程序什么都不做,这是一件好事,因为它不会浪费资源。
这有意义吗?
答案 1 :(得分:0)
此question有一个答案,其中包含指向MSDN文章的链接以及一些示例代码。它应该做你想要的(长期)。在短期内回答你的'为什么是悬挂问题',你是“悬挂”,因为你在一个线程上循环检查文本字段的值。