如何仅将键击发送到表单而不是其他窗口?

时间:2011-03-13 23:24:20

标签: .net vb.net

如何在不干扰其他程序的情况下让表单发送Tab键,Enter键,左箭头等键盘给自己?如果我使用SendKeys.Send方法,它会将它发送到任何打开的窗口。有没有办法只使用表单?

非常快速的随机示例:

假设我有5个文本框,然后单击“标签”按钮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)

为什么会出错?

因为它不是点击“标签”而是将标签发送到文本框,所以我仍然专注于相同的文本框。它实际上并未将焦点更改为下一个文本框。

如果有可能帮助我,如果不是,我会自己尝试更多。

1 个答案:

答案 0 :(得分:4)

因为这是在你自己的应用程序内部,所以绝对没有理由伪造输入,这是一个众所周知的微妙区域。

只需直接调用您需要的方法即可。

修改

由于你似乎非常热衷于伪造的输入,我会试着解释它的难点。首先,输入不是发送同步到Windows,而是发送异步发送到拥有输入焦点的线程的消息队列。当该线程抽取其消息时,它将输入消息传递到适当的窗口。

输入消息的主要复杂因素是系统保存了隐藏的键盘状态信息,您无法通过PostMessage()进行伪造。例如,阅读GetKeyboardState()的文档。如果你想伪造一个SHIFT + TAB键组合,那么你根本不能用PostMessage()来做,因为这不会使SHIFT处于键盘状态。它只能通过SendInput()完成。