【问题标题】:How do I send Keystrokes only to the Form and not other window?如何仅将击键发送到表单而不发送到其他窗口?
【发布时间】:2011-03-13 23:24:20
【问题描述】:

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

非常快速的随机示例:

假设我有 5 个文本框,我点击了 5 次“Tab”按钮。会发生什么?

它会将焦点从一个文本框更改为另一个文本框,对吗?

  • 我可以让它自动发生吗...就像让它在后台发生并且只发生在表单本身。因此,如果我在记事本上输入内容,我不想收到这 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)

为什么会出错?

因为不是单击“选项卡”,而是将选项卡发送到文本框,所以我仍然专注于同一个文本框。它实际上并没有将焦点更改为下一个文本框。

如果可能的话,请帮助我,如果没有,我会自己尝试更多。

【问题讨论】:

  • 您到底想做什么?解决问题的一半(“哈哈!我知道!我会伪造输入”)并为另一半寻求帮助(“我如何伪造输入?”)并不是一个好主意。如果您告诉我们您要解决的问题,您会得到更好的答案。
  • 我还是不明白为什么 TextBox1.Focus 不行。为什么你认为你需要伪造输入到你的自己的应用程序?
  • @martinhofernandes 假设它现在不是我的应用程序......我还能做同样的事情吗?访问该文本框,单击选项卡,自动。
  • @martinho-fernandes 你还在吗?我是这个论坛的新手?大声笑

标签: .net vb.net


【解决方案1】:

由于这是在您自己的应用程序中,因此绝对没有理由伪造输入,这是一个众所周知的敏感领域。

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

编辑

由于您似乎非常热衷于伪造输入,所以我将尝试解释它的难点。首先,输入不是同步发送到windows,而是异步发布到拥有输入焦点的线程的消息队列。当该线程泵送其消息时,它会将输入消息传递到相应的窗口。

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

【讨论】:

  • 如果它不在我自己的应用程序上,我应该怎么做?
  • 这是你的应用程序。所以输入伪造是错误的解决方案。
  • 谢谢,我只需要正确的条款。我会做更多的谷歌搜索......我认为我现在正朝着正确的方向前进。
  • @Questions 由于您是新手,您可能需要考虑接受答案。如果您对答案感到满意,只需将答案顶部旁边的勾号变为绿色即可。另请阅读关于接受答案等的常见问题解答。
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多