VB.NET Send Tab key to another application window

后端 未结 3 1263
长情又很酷
长情又很酷 2021-01-07 15:40

I want to send \"{TAB}\" Key to another application window(send the key to the window not to textbox).

I tried:

SendMessage(hWnd, WM         


        
相关标签:
3条回答
  • 2021-01-07 15:56

    you need make the other window active first. check Change focus to another window in VB.NET . then use send key.

    0 讨论(0)
  • 2021-01-07 16:05

    SendKeys requires the application that you are sending the Keys to, to be active.

    From above Link:

    Use SendKeys to send keystrokes and keystroke combinations to the active application.

    I order to get around this limitation you will have to resort to using the WinApi Functions.

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

    See this MSDN Forum Post for an example

    Here is a modified example from that Posting:

    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
    

    Added an Additional Example using WM_KEYDOWN I created another small application with the Window Title set to TestForm and overrode the WndProc Method to determine if the application got the TabKey.

    Sending Form

    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
    

    Test Form

    Put a breakpoint on MyBase.WndProc(m) and look at m to see what has been sent.

    Public Class Form1
    
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            MyBase.WndProc(m)
        End Sub
    
    End Class
    
    0 讨论(0)
  • 2021-01-07 16:16

    Having struggled with this type of this a few times before, i would suggest a couple of things to look at.

    The 1st is autoit which includes a dll you can reference from vb.net, and is very simple you use, and well documented. I tend to use that whenever i need to control a 3rd party program.

    The other is the ui automation classes See this for an example:

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

    0 讨论(0)
提交回复
热议问题