我想将“{TAB}”键发送到另一个应用程序窗口(将键发送到窗口而不是文本框)。
我试过了:
SendMessage(hWnd, WM_SETHOTKEY, VK_TAB, 0)
没啥事儿。
我的目标是:
当应用程序窗口不在焦点
时,
将制表键发送到我的应用程序或其他应用程序。
(我知道 sendkey 在这种情况下不专业,别无选择(这是我第一次使用它)。)
我做了很多尝试,但总是返回相同的结果:
没啥事儿。
有人知道答案吗?
我想将“{TAB}”键发送到另一个应用程序窗口(将键发送到窗口而不是文本框)。
我试过了:
SendMessage(hWnd, WM_SETHOTKEY, VK_TAB, 0)
没啥事儿。
我的目标是:
当应用程序窗口不在焦点
时,
将制表键发送到我的应用程序或其他应用程序。
(我知道 sendkey 在这种情况下不专业,别无选择(这是我第一次使用它)。)
我做了很多尝试,但总是返回相同的结果:
没啥事儿。
有人知道答案吗?
SendKeys要求您将密钥发送到的应用程序处于活动状态。
从上面的链接:
使用 SendKeys 将击键和击键组合发送到活动应用程序。
我为了绕过这个限制,你将不得不求助于使用 WinApi 函数。
有关示例,请参阅此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
之前曾多次与这种类型作斗争,我建议看几件事。
第一个是autoit,它包含一个您可以从 vb.net 引用的 dll,而且您使用起来非常简单,并且有据可查。每当我需要控制第 3 方程序时,我倾向于使用它。
另一个是ui 自动化类 ,例如:
http://blog.functionalfun.net/2009/06/introduction-to-ui-automation-with.html
您需要先激活另一个窗口。检查将焦点更改到 VB.NET 中的另一个窗口。然后使用发送键。