[英]How do I send Keystrokes only to the Form and not other window?
如何在不干扰其他程序的情况下让表单发送Tab键,Enter键,左箭头等键盘给自己? 如果我使用SendKeys.Send方法,它会将它发送到任何打开的窗口。 有没有办法只使用表单?
非常快速随机的例子:
假设我有5个文本框,然后单击“标签”按钮5次。 会发生什么 ?
它会将焦点从一个文本框改为另一个文本框吗?
顺便说一下,我知道我可以使用这段代码来改变fofucs,但请记住它只是一个例子。
TextBox1.Focus
我真的希望有人能指引我到正确的地方,但我自己也在取得进步,但我正在寻求更多的帮助。 我只需要间接点击标签按钮(我没有在表单上激活),也没有sendkeys方法。 可能吗?
这是我的尝试,我认为这是错误的
Private Declare Ansi Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Public Const WM_CHAR = &H102
Dim hwnd As Integer = FindWindow(vbNullString, "Form1")
Dim x As Integer = FindWindowEx(hwnd, 0, "WindowsForms10.EDIT.app.0.14fd2b5", vbNullString)
Dim keys As Keys
' send some keys
SendMessage(x, WM_CHAR, Keys.Tab, 0)
为什么这是错的?
因为它不是点击“标签”而是将标签发送到文本框,所以我仍然专注于相同的文本框。 它实际上并未将焦点更改为下一个文本框。
如果有可能帮助我,如果不是,我会自己尝试更多。
由于这是在你自己的应用程序内,绝对没有理由伪造输入,一个众所周知的微妙区域。
只需直接调用您需要的方法即可。
编辑
既然你似乎非常热衷于伪造输入,我会试着解释它的难点。 首先输入的不同步发送到Windows,而是会以异步方式发布到拥有输入焦点的线程的消息队列。 当该线程泵送其消息时,它将输入消息传递到适当的窗口。
输入消息的主要复杂因素是系统保存隐藏的键盘状态信息,您无法通过PostMessage()
伪造它们。 例如,阅读GetKeyboardState()
的文档。 如果你想伪造一个SHIFT + TAB键组合,那么你根本无法使用PostMessage()
因为这不会使SHIFT处于键盘状态。 它只能通过SendInput()
来完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.