【问题标题】:How do I simulate/release keyboard keys?如何模拟/释放键盘键?
【发布时间】:2017-12-22 16:06:09
【问题描述】:

如果满足某个条件,我需要一种模拟键盘键的方法,我还需要知道当前按下的是模拟键还是真实键。这需要在主应用程序之外工作。

这就是我需要它的工作方式:

    Dim UserDefinedKey As Keys = Keys.H
    Do
        If GetAsyncKeyState(UserDefinedKey) Then
            Thread.Sleep(30)
            'release the set key
            Thread.Sleep(30)
            'press/hold the set key once, continue the loop if the real key is still been held.
        End If
    Loop While GetAsyncKeyState(UserDefinedKey) '/ loop while real key is being held
    'Real key is no longer held, release the simulated key press.

任何帮助将不胜感激。 (这段代码是为了自动化游戏内部的某些事情,这就是为什么它需要在主应用程序之外工作)

我有一些东西可以让用户设置自己的键,这只是我需要的一个小例子,它只是我坚持使用的键盘模拟部分并确定是否仍然按下真正的键与否。

【问题讨论】:

  • 您好!好久不见! ;) -- 现在你很幸运,因为另一个用户要求我创建我的MouseInputHelper 的键盘版本,这将允许你向你持有的同一个键发送垃圾邮件,而不会干扰GetAsyncKeyState()。完成后我会发布答案!
  • 相同的按键代码有点复杂,这就是为什么它需要一些时间......

标签: vb.net keyboard keystore simulate


【解决方案1】:

很抱歉让您久等了...通过Window Messages 模拟键盘输入结果比模拟鼠标输入要复杂得多 /em> 以同样的方式。

无论如何,我终于完成了,所以这是一个 complete InputHelper 类,用于通过 鼠标和键盘输入虚拟模拟鼠标和键盘输入流或通过窗口消息

在 GitHub 下载:https://github.com/Visual-Vincent/InputHelper/releases
(源代码太长,无法粘贴到答案中)

Dim UserDefinedKey As Keys = Keys.H

'Using a regular While-loop is better since you won't need your If-statement then.
While InputHelper.Keyboard.IsKeyDown(UserDefinedKey)
    Dim ActiveWindow As IntPtr = InputHelper.WindowMessages.GetActiveWindow()
    Thread.Sleep(30)
    InputHelper.WindowMessages.SendKey(ActiveWindow, UserDefinedKey, False) 'False = Key up.
    Thread.Sleep(30)
    InputHelper.WindowMessages.SendKey(ActiveWindow, UserDefinedKey, True) 'True = Key down.
End While

关于InputHelper的子类的一点信息:

InputHelper.Keyboard

  • 处理和模拟物理键盘输入的方法(即GetAsyncKeyState()检测到的输入)。

InputHelper.Mouse

  • 处理和模拟物理鼠标输入的方法。

InputHelper.WindowMessages

  • 处理和模拟虚拟键盘和鼠标输入的方法(即GetAsyncKeyState()未检测到的输入)。

希望这会有所帮助!

【讨论】:

  • @Joey :嗯,这是我以前从未遇到过的问题......可能是WindowMessages.SendKey() 试图将自己附加到当前活动窗口的线程(为了找到活动的孩子它的窗口/控件),这应该会重置GetAsyncKeyState() 的状态。我会调查的。
  • @Joey :另外,是的:使用 InputHelper.KeyboardInputHelper.Mouse 完成的任何模拟都会干扰其他键,因为它们模拟 physical 输入(如答案中所述)。 InputHelper.WindowMessages 中的任何内容都是您想要用来模拟 Get(Async)KeyState() 等未检测到的完全虚拟输入的内容。当我有时间时,我将为类中的所有方法制作适当的文档。跨度>
  • @Joey:你怎么注意到他们卡住了?我似乎无法重现您的问题。
  • @Joey :进行了更新。请下载最新版本(与答案中的链接相同)并尝试在我的答案中编辑的代码。这只会获取活动的顶级窗口(因为游戏通常没有子窗口),并有望解决您的问题,因为它不会与其他线程混淆,因此不会与当前的键盘状态混淆。
  • @Joey:没问题,很高兴我能帮上忙!祝你的项目好运!
【解决方案2】:

您将需要 Windows API 挂钩(初学者不需要),或像 MouseKeyHook 这样的第三方库

【讨论】:

  • 他希望按下他持有的同一个键,而不是检测击键。他已经通过GetAsyncKeyState() 检测到击键。 -- 问题是检测击键的标准方法(GetAsyncKeyState(),钩子等)也检测虚拟键,这导致他的代码无限期地运行。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2011-09-17
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多