VB.NET Отправить клавишу Tab в окно другого приложения

Я хочу отправить ключ "{TAB}" в окно другого приложения (отправить ключ в окно, а не в текстовое поле).

Я пытался:

SendMessage(hWnd, WM_SETHOTKEY, VK_TAB, 0)

Ничего не случилось.
моя цель:
отправить клавишу табуляции моему приложению или другому приложению, когда окно приложения не в фокусе.
(Я знаю, что sendkey не профессионален, в этом случае выбора нет (я использую его впервые).)

Я делал много попыток и всегда возвращался к одному и тому же результату:

Ничего не произошло.

Кто-нибудь знает ответ?


person Nmmmm    schedule 30.10.2012    source источник


Ответы (3)


SendKeys требует, чтобы приложение, которому вы отправляете ключи, было активный.

Сверху Ссылка:

Используйте SendKeys для отправки нажатий клавиш и комбинаций клавиш в активное приложение.

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

  1. FindWindow pInvoke.net
  2. FindWindowEx pInvoke.net
  3. sendMessage pInvoke.net

См. Пример в форуме MSDN.

Вот модифицированный пример из этой публикации:

Public Class Form1
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                     (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
                     (ByVal hWnd As IntPtr, ByVal hWndChildAfterA As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                     (ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
    Const WM_SETTEXT As Integer = &HC

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim destination As IntPtr = FindWindow(Nothing, "Untitled - Notepad")
        Dim destControl As IntPtr = FindWindowEx(destination, IntPtr.Zero, "Edit", Nothing)
        SendMessage(destControl, WM_SETTEXT, IntPtr.Zero, "Hello" & vbTab & "GoodBye" & vbCrLf)

    End Sub

End Class

Добавлен дополнительный пример с использованием WM_KEYDOWN. Я создал еще одно небольшое приложение с заголовком окна, установленным на TestForm, и переопределил метод WndProc, чтобы определить, получило ли приложение TabKey.

Форма отправки

Public Class Form1

    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                 (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                 (ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As IntPtr
    Const WM_KEYDOWN As Integer = &H100
    Const VK_TAB As Integer = &H9

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim destination As IntPtr = FindWindow(Nothing, "TestForm")
        SendMessage(destination, WM_KEYDOWN, VK_TAB, 0)

    End Sub

End Class

Тестовая форма

Установите точку останова на MyBase.WndProc (m) и посмотрите на m, чтобы увидеть, что было отправлено.

Public Class Form1

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        MyBase.WndProc(m)
    End Sub

End Class
person Mark Hall    schedule 31.10.2012
comment
вы отправляете в класс редактирования, я хочу отправить сообщение (TAB KEY) в главное окно неактивного приложения. Я использую WM_KEYDOWN и WM_KEYUP, а не WM_SETTEXT. - person Nmmmm; 31.10.2012
comment
@Nmmmm Чего именно вы пытаетесь достичь, пример, который вы показываете в своем вопросе, выглядит так, как будто вы пытаетесь создать HotKey, хотя в документации указано, что vk_Tab недопустим для этой цели. Код, который я вам дал, отправит текст в элемент управления редактированием, который является частью Блокнота. Я добавлю еще один пример, чтобы показать работу WM_keyDown. - person Mark Hall; 01.11.2012

Я уже несколько раз боролся с этим типом этого, и я бы посоветовал взглянуть на пару вещей.

Первый - autoit, который включает в себя dll, на который можно ссылаться с vb.net, и очень прост в использовании и хорошо документирован. Я обычно использую это всякий раз, когда мне нужно управлять сторонней программой.

Другой - классы автоматизации пользовательского интерфейса. См. Это для примера:

http://blog.functionalfun.net/2009/06/introduction-to-ui-automation-with.html

person Steve    schedule 30.10.2012

вам нужно сначала сделать другое окно активным. проверьте Изменить фокус на другое окно в VB.NET. затем используйте кнопку отправки.

person urlreader    schedule 30.10.2012
comment
прочтите то, что я написал еще раз. Я хочу отправлять ключи, когда окно не в фокусе. - person Nmmmm; 31.10.2012
comment
Думаю нельзя послать ключи, если он не в фокусе. Я уверен в этом на 50% :), потому что я пробовал это несколько лет назад и не мог понять, как это сделать, кроме как сначала перевести окно в фокус. однако я мог ошибаться. - person urlreader; 31.10.2012