Как вызвать нажатие кнопки WinForms из удаленного потока

У меня есть приложение, которое я разработал в VB 2010. Оно состоит из ряда форм Windows и процесса прослушивания, который прослушивает ввод с MIDI-устройства (клавиатуры и т. д.). Этот процесс слушателя выполняется в отдельном потоке.

Используя функцию обратного вызова и метод вызова, я могу обновить значение текстового поля в одной из форм значением нот, воспроизводимых на MIDI-устройстве (код ниже).

Чего я не могу сделать, так это вызвать нажатие кнопки на одной из кнопок, чтобы часть кода выполнялась в той же форме, используя другую функцию обратного вызова и вызов.

Я погуглил и не могу найти никаких рабочих примеров, поэтому я не уверен, что это возможно - я надеюсь, что это потому, что это последний 1% моего проекта!

Вот что работает для обновления текстового поля в форме, что мне нужно изменить, чтобы нажать кнопку в той же форме с именем btn_NextSection ?

' Because the MIDI listener process runs in a different thread
' it can read the states of controls on the parent form but it
' cannot modify them so we need to identify the parent process
' and update the text box as that one instead

' Set up the callback
Private Delegate Sub SetNextSectionTextCallback(ByVal [text] As String)

' Updates NextSection
Private Sub SetNextSectionText(ByVal [text] As String)
    ' Function to see if the thread that tries to update the
    ' text box is the same as the one that started it.  If it
    ' isn't then locate parent process and update as that one
    If callerInstance.txt_NextSection.InvokeRequired Then
        Dim d As New SetNextSectionTextCallback(AddressOf SetNextSectionText)
        callerInstance.Invoke(d, New Object() {[text]})
    Else
        callerInstance.txt_NextSection.Text = [text]
    End If
End Sub

Заранее спасибо !


person user1647208    schedule 23.04.2013    source источник
comment
Итак, вы хотите имитировать внешний вид нажатия кнопки (визуальный эффект?), или вы хотите запустить код, который запускается в событии щелчка.   -  person PatFromCanada    schedule 23.04.2013


Ответы (1)


Предполагая, что вы хотите запустить код, а не имитировать нажатие кнопки, попробуйте что-то вроде этого. Для Invoke требуется функция, поэтому вам может понадобиться создать фиктивный возвращаемый объект.

Private Sub btn_NextSection_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btn_NextSection.Click
    NextSection()
End Sub

Private Function NextSection() As Object
    'do something on the UI thread
    Return Nothing ' to satisfy the requirements of Invoke
End Function

Private Sub AnotherThreadHere()
    'call NextSection on the UI thread
    Application.Current.Dispatcher.Invoke(Windows.Threading.DispatcherPriority.Background, New Action(Function() NextSection()))
End Sub
person PatFromCanada    schedule 23.04.2013
comment
Спасибо за ответ, Пэт, и вы правы, я действительно хочу запустить код, который находится в другой форме. Я попробовал ваше предложение, но есть две проблемы. Во-первых, у меня нет System.Windows.RoutedEventArgs — у меня есть System.Windows.Forms, но нет опции RoutedEventArgs. А во-вторых, у меня нет доступа к Application.Current.Dispatcher - person user1647208; 23.04.2013
comment
Извините, я не понял, что это специфично для WPF. Я не работал в winforms какое-то время. Кажется, что Invoke — правильная идея. - person PatFromCanada; 23.04.2013