vb.net sendkeys для любого активного приложения

Я пытаюсь создать приложение 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, затем он будет выполнять цикл и посылать клавиши, пока я не нажму кнопку «Стоп». но мне не повезло. надеюсь, что кто-нибудь может мне помочь и добавить какой-нибудь код, который будет работать, даже если я изменю активные окна и продолжу посылать клавиши или нажатия клавиш. Спасибо


person hack nayan    schedule 27.03.2013    source источник


Ответы (2)


Причина, по которой он зависает, заключается в том, что вы делаете все это в одном потоке. Происходит щелчок, и приведенный выше код запускается в одном потоке. При входе в цикл 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

Это меняется, чтобы использовать два разных обработчика событий, один для нажатия кнопки и один для срабатывания таймера каждый раз, каждый из которых вызывается, когда происходит соответствующее событие. В остальное время ваша программа ничего не делает, и это хорошо, так как она не тратит ресурсы впустую.

Имеет ли это смысл?

person GregL    schedule 27.03.2013

На этот вопрос есть ответ со ссылкой на статью MSDN а также пример кода. Он должен делать то, что вы хотите (в долгосрочной перспективе). В краткосрочной перспективе, чтобы ответить на ваш вопрос «почему это зависает», вы «зависаете», потому что вы находитесь в цикле в одном потоке, проверяя значение текстового поля.

person codechurn    schedule 27.03.2013