0

我想将“{TAB}”键发送到另一个应用程序窗口(将键发送到窗口而不是文本框)。

我试过了:

SendMessage(hWnd, WM_SETHOTKEY, VK_TAB, 0)

没啥事儿。
我的目标是: 当应用程序窗口不在焦点 时,
将制表键发送到我的应用程序或其他应用程序。我知道 sendkey 在这种情况下不专业,别无选择(这是我第一次使用它)。)

我做了很多尝试,但总是返回相同的结果:

没啥事儿。

有人知道答案吗?

4

3 回答 3

8

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
于 2012-10-31T01:58:52.943 回答
1

之前曾多次与这种类型作斗争,我建议看几件事。

第一个是autoit,它包含一个您可以从 vb.net 引用的 dll,而且您使用起来非常简单,并且有据可查。每当我需要控制第 3 方程序时,我倾向于使用它。

另一个是ui 自动化类 ,例如:

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

于 2012-10-30T23:25:25.787 回答
0

您需要先激活另一个窗口。检查将焦点更改到 VB.NET 中的另一个窗口。然后使用发送键。

于 2012-10-30T22:15:27.073 回答