2013-03-27 3 views
2

im пытается сделать приложение vb.net, которое отправляет ключи в любое приложение, которое я активирую, но для начинающих, таких как я, я начал использовать его в текстовом поле. но моя проблема - после того, как я нажму кнопку «Пуск», чтобы запустить ключи отправки, мое приложение зависает. так вот мой код.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 

так что идея, если я нажимаю button1, текст изменится на «Стоп», то она будет направлена ​​на TextBox1 тогда он будет делать петлю и SendKeys, пока я не нажать стоп. но мне не повезло. надеюсь кто-то может мне помочь и добавить somecode, который будет работать, даже я меняю активные окна и продолжаю на sendkeys или нажатие клавиши. thx

ответ

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 

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

Это имеет смысл?

0

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

Смежные вопросы