【问题标题】:vb.net sendkeys to any active applicationvb.net 向任何活动应用程序发送密钥
【发布时间】:2013-03-28 07:56:53
【问题描述】:

我正在尝试制作一个 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

所以我的想法是,如果我按下 button1,文本将变为“Stop”,然后它将专注于 textbox1,然后它将执行循环和发送键,直到我按下停止。但我没有运气。希望有人可以帮助我并添加一些代码,即使我更改活动窗口并继续发送键或击键也能正常工作。谢谢

【问题讨论】:

    标签: vb.net sendkeys


    【解决方案1】:

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

    我建议您改为设置一个计时器,每 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】:

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

      【讨论】:

        猜你喜欢
        • 2014-02-15
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多