VB 按住按键

2024-02-18

我正在创建一个宏程序来记录和回放鼠标和键盘输入。录音效果很好,鼠标播放也很好,但我在播放键盘输入时遇到了麻烦 - 特别是在释放之前按住某个键几秒钟。这并不等同于重复按键。这是我尝试过的:

技术 1:Me.KeyDown

 Private Sub keyboard_pressed() Handles Me.KeyDown
        Dim keypress = e.KeyData
        MsgBox(keypress)
    End Sub

仅当窗口处于焦点状态时才有效。

技术 2:SendKeys

 Private Sub timer_keyboardplayback_Tick() Handles timer_playback.Tick
            SendKeys.Send("{LEFT}")
            timer_playback.Interval = 30
    End Sub

失焦,但重复按向左箭头而不是按住箭头

技术3:keybd_event

 Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
 Private Sub timer_keyboardplayback_Tick() Handles timer_playback.Tick
      Const keydown = &H1
      Const keyup = &H2
      Dim VK_LEFT = 37
      keybd_event(VK_LEFT, 0, keydown, 0)
 End Sub

失焦,但仍然无法按下按住箭头

有人可以告诉我如何实现按住左箭头键几秒钟,然后松开。


The keybd_event and mouse_event几年前,函数已被弃用。相反,你应该使用SendInput()功能 https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx.

使用它来模拟来自 .NET 的输入有时会有点棘手,幸运的是,尽管我已经编写了一个名为输入助手 (从 GitHub 下载 https://github.com/Visual-Vincent/InputHelper/releases) 这是一个包装器SendInput()。我对其进行了定制,使其涵盖了输入处理和输入模拟的许多不同方式中的一些,主要是:

  • 模拟击键(内部利用SendInput()).
  • 模拟鼠标移动和鼠标按钮点击(也利用SendInput()内部)。
  • 将虚拟击键和鼠标点击发送到当前/特定窗口(内部利用窗口消息 https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927(v=vs.85).aspx).
  • 创建全局的、低级的鼠标和键盘挂钩。

不幸的是,我还没有时间写一个关于这个的适当的文档/wiki(除了库每个成员的 XML 文档,这是由 Visual Studio 的 IntelliSense 显示的),但到目前为止你可以找到一些关于创建钩子项目的维基 https://github.com/Visual-Vincent/InputHelper/wiki.

该库包含的内容的简短描述:

  • InputHelper.Hooks

    用于创建全局的、低级的鼠标/键盘挂钩(利用SetWindowsHookEx() https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx以及其他相关方法)。这部分包含在wiki https://github.com/Visual-Vincent/InputHelper/wiki/Low-level-keyboard-hook.

  • InputHelper.Keyboard

    用于处理/模拟物理键盘输入(利用SendInput() and GetAsyncKeyState() https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v=vs.85).aspx).

  • InputHelper.Mouse

    用于处理/模拟物理鼠标输入(利用SendInput()).

  • InputHelper.WindowMessages

    用于处理/模拟虚拟鼠标/键盘输入,例如特定窗口(利用SendMessage() https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx and PostMessage() https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944(v=vs.85).aspx).

发送击键

发送“物理”击键可以通过两个函数完成:

  • InputHelper.Keyboard.PressKey(Key As Keys, Optional HardwareKey As Boolean)

    发送指定键的两次击键(向下和向上)。

    If HardwareKey设置后,该功能将发送密钥的扫码 https://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx#scan_code而不是它的虚拟键码 https://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx#_win32_Virtual_Key_Codes_Described (默认为False).

  • InputHelper.Keyboard.SetKeyState(Key As Keys, KeyDown As Boolean, Optional HardwareKey As Boolean)

    发送指定键的单个击键。

    If KeyDown is True该按键将作为 KEYDOWN 事件发送,否则为 KEYUP。

    HardwareKey与上面相同。

您可以使用后者,因为您想要控制按住按键的时间。

按住某个键指定的时间

为了做到这一点,你需要使用某种计时器,就像你已经做的那样。然而,为了让事情变得更加动态,我编写了一个函数,可以让您指定按住哪个键以及按住多长时间。

'Lookup table for the currently held keys.
Private HeldKeys As New Dictionary(Of Keys, Tuple(Of Timer, Timer))

''' <summary>
''' Holds down (and repeats, if specified) the specified key for a certain amount of time. 
''' Returns False if the specified key is already being held down.
''' </summary>
''' <param name="Key">The key to hold down.</param>
''' <param name="Time">The amount of time (in milliseconds) to hold the key down for.</param>
''' <param name="RepeatInterval">How often to repeat the key press (in milliseconds, -1 = do not repeat).</param>
''' <remarks></remarks>
Public Function HoldKeyFor(ByVal Key As Keys, ByVal Time As Integer, Optional ByVal RepeatInterval As Integer = -1) As Boolean
    If HeldKeys.ContainsKey(Key) = True Then Return False

    Dim WaitTimer As New Timer With {.Interval = Time}
    Dim RepeatTimer As Timer = Nothing

    If RepeatInterval > 0 Then
        RepeatTimer = New Timer With {.Interval = RepeatInterval}

        'Handler for the repeat timer's tick event.
        AddHandler RepeatTimer.Tick, _
            Sub(tsender As Object, te As EventArgs)
                InputHelper.Keyboard.SetKeyState(Key, True) 'True = Key down.
            End Sub
    End If

    'Handler for the wait timer's tick event.
    AddHandler WaitTimer.Tick, _
        Sub(tsender As Object, te As EventArgs)
            InputHelper.Keyboard.SetKeyState(Key, False) 'False = Key up.

            WaitTimer.Stop()
            WaitTimer.Dispose()

            If RepeatTimer IsNot Nothing Then
                RepeatTimer.Stop()
                RepeatTimer.Dispose()
            End If

            HeldKeys.Remove(Key)
        End Sub

    'Add the current key to our lookup table.
    HeldKeys.Add(Key, New Tuple(Of Timer, Timer)(WaitTimer, RepeatTimer))

    WaitTimer.Start()
    If RepeatTimer IsNot Nothing Then RepeatTimer.Start()

    'Initial key press.
    InputHelper.Keyboard.SetKeyState(Key, True)

    Return True
End Function

用法示例:

'Holds down 'A' for 5 seconds, repeating it every 50 milliseconds.
HoldKeyFor(Keys.A, 5000, 50)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB 按住按键 的相关文章

  • 用户完成后关闭 Excel

    任务非常简单 我想从 VB net GUI 打开 Excel 文档 xls 用户将处理 Excel 文件 用户完成后关闭 Excel 文件 我想要VB net代码释放Excel对象 问题是 当用户关闭文件时 Excel 对象仍然可以在任务管
  • .Net 2 迭代器的巧妙使用[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 C 2 和 VB Net 8 引入了一项新功能 称为迭代器 http msdn microsoft com en us library dscy
  • 按下 Tab 键时 PictureBox 抛出“参数无效”ArgumentException

    我有一个表单 用户可以首先扫描到位图 扫描完成并加载位图后 我将启用 4 个文本框 每个文本框旁边都有一个名为 从图像剪切 的按钮 当用户单击该按钮时 他们可以在位图中单击并拖动以使用 MODI 获取选定的文本 除了一个恼人的错误之外 这一
  • WPF DataGrid 绑定到 string.Length 而不是字符串文本

    我是 WPF 的新手 并且真诚地尝试自己尽可能多地弄清楚 我已经创建了第一个 DataGrid 控件 并且尝试使用如下字符串列表填充它
  • 带分页的自定义数据表

    我正在使用我的自定义DataTable as a DataSource to my ListView 现在 我面临的问题是Paging不管用 我想做的是当我点击页面时1 2等等 我应该一次只能获取 10 行 我的意思是 当页面加载时 我只想
  • VB.NET 中字节数组的数组

    我需要一个数组 数组中的每个项目都是这样的字节数组 但我不知道如何执行以下操作 Dim xx as array xx 0 as byte H12 HFF xx 1 as byte H45 HFE 您可以像这样创建嵌套或 锯齿状 字节数组 D
  • vb.net中如何读取串口数据?

    我创建了一个类 有一个名为 SendUSSD 的子类 当调用它时 它会向连接 gsm 手机的 COM 端口发送一个 ussd 代码 如 123 此 usd 应该返回移动余额 If IsOpen True Then checks if the
  • VB.NET 与 C# 中的属性实现多级继承

    假设我有 2 个接口 如下定义 public interface ISkuItem public string SKU get set public interface ICartItem ISkuItem public int Quant
  • 拆分容器,制作固定面板

    我有一个水平方向的 splitcontainer 我希望仅在表单调整大小期间为 panel2 设置固定高度 并让 splitter 调整 panel2 大小 现在我正在这样做 但我不满意 因为用户注意到面板调整了大小 Private Sub
  • 如何将 POST 请求内容保存为 .NET 中的文件 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个客户端应用程序POST请求a
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • 如何从vb.net插入两个表

    我想将两个值插入到我创建的 SQL 数据库的两个表中 在我的 vb net 代码中 我的问题是 如果我插入它 它会被插入 但仅在一张表中 否则有时它不会进入内部 这是我使用过的代码 c TextBox1 Text sh TextBox2 T
  • 在 Visual Studio 2017 中使用 .wid 文件

    我已经使用 Visual Studio 2017 Professional 创建了一个安装项目 vdproj file 我想使用本页中建议的密码对话框 https www codeproject com Tips 659367 Passwo
  • 在word中添加超链接,使用vb.net

    我目前正在尝试通过 VB 程序在 word 中添加一个指向 web url 的超链接 我正在跌跌撞撞地尝试找到正确的语法以及完成此任务所需的内容 因为我收到了很多无用的 VBA 示例 而这根本不是我需要的 我的代码如下所示 sPara2 o
  • VB.NET DatetimePicker - 错误的周数

    我的 vb net 扩展日期时间选择器有问题 当元素传递到新年 2016 时 左侧显示的周数是错误的 我有一个 datetimepicker 它不是默认组件 它是在此处下载的 http www codeproject com Article
  • VB.NET“Like”运算符中可能存在错误?

    为什么下面的评价为True Dim result b Like a b Thanks EDIT 为了概括这一点 以下返回True String1 Like AnyText1 AnyText2 AnyText String1 VBA 工作正常
  • “更新/取消”按钮不会出现在模板字段编辑按钮中

    当您使用 Gridview 的每一行创建编辑按钮时CommandField单击后它会显示更新 取消按钮 以便您可以接受 取消更改 但是 我想要一个带有工具提示文本的编辑按钮 因为CommandField没有工具提示属性 我用过Templat
  • 将 .NET P/Invoke 代码组织为 Win32 API 的最佳实践

    我正在 NET 中重构一个大型且复杂的代码库 该代码库大量使用 P Invoke to Win32 API 该项目的结构不是最好的 我发现 DllImport 语句遍布各处 经常为同一函数重复 并且还以多种方式声明 导入指令和方法有时声明为
  • VB - 如何读取和写入二进制文件?

    如何从任何文件读取原始字节数组 Dim bytes as Byte 然后将该字节数组写回到新文件中 我需要它作为字节数组来在两者之间进行一些处理 我目前正在使用 To read Dim fInfo As New FileInfo dataP
  • 比较数组中的文件、从文本文件中删除行、函数、日志记录

    所以我创建了这两个数组 Approved Shares 和 Current Shares Reads Approvedshare txt and makes the txt file into an array public objFSO

随机推荐

  • 任何人都有一些用于 ASP.NET MVC 的下拉日期选择器

    有人知道我在哪里可以找到 html 帮助器或将生成由 3 个下拉列表组成的日期选择器的东西吗 这是我的小帮手 我相信 这本身就是解释性的 可以调整以安排下拉列表的顺序 月 日 年或日 月 年 如果您使用的是 NET 4 则可以为名称添加默认
  • 如何将 jQuery 元素选择应用于字符串变量

    我将一些 html 提取到字符串 var 然后想在该字符串上使用 jQuery 元素选择 这可能吗 例如 HTML div class message This is a message Click a class link href ex
  • 将行计数传递给 Oracle 中的列[重复]

    这个问题在这里已经有答案了 我有一张没有 ID 的桌子 所以我想添加一个新列 其总行数为 1 我在表中打开了一个新列 但我不知道如何用行数填充它 我在互联网上搜索 但找不到解决我的问题的解决方案 你能告诉我该怎么做吗 提前致谢 您可以执行此
  • 仅在行尾显示为菱形问号的字符(Python>文本)

    我正在开发一个 Python 文件 该文件输入一个包含日语字符 UTF 8 的文本文件 获取一些文本 并将其写入一个新的 UTF 8 文本文件 我遇到的问题是 由于某种原因 每当日语字符 出现在原始输入文件中的行尾时 它就会在输出文件中显示
  • jQuery UI 滑块与光滑轮播的干扰

    拖动手势干扰了 jQuery UI 中的滑块和光滑的轮播插件 http kenwheeler github io slick 也是 jQuery 看我的例子here http jsfiddle net 65wtmyrb 1 HTML div
  • 当页面滚动并有某个位置时执行某些操作

    我在页面滚动方面遇到了一些问题 当我向下滚动页面并且窗口距顶部位置 100px 时 我想更改一些 css 这是我的代码 非常感谢您的帮助 document ready function window scroll function if w
  • 使用 XAML 和 C# 为 Windows Phone 8 应用程序设置计时器

    我正在开发 Windows Phone 8 游戏应用程序 我需要将倒计时功能添加到我的应用程序中 就像应用程序启动时一样 定时器值显示 60 59 58 0 当 0 到达时显示消息 超时 我在谷歌搜索但我不知道 可能是我没有以正确的方式搜索
  • Kibana - 如何导出搜索结果

    我们最近将集中式日志记录从 Splunk 转移到 ELK 解决方案 并且我们需要导出搜索结果 有没有办法在 Kibana 4 1 中做到这一点 如果有的话 也不是很明显 Thanks 这是一个旧帖子 但我认为仍然有人仍在寻找一个好的答案 您
  • python2 与 python3 中的地图[重复]

    这个问题在这里已经有答案了 我是一个初学者 python 用户 我在 python2 7 和 python3 4 3 上运行了以下代码 import matplotlib pyplot as plt import numpy as np i
  • WPF 文本块,文本属性中的换行符

    有没有办法拥有 n在 a 中换行TextBlock
  • 如何创建文件并从 html 页面附加数据?

    我的桌面上有一个 html 文件 需要一些输入 我将如何将该输入写入计算机上的文件中 我是否必须使用另一种语言来执行此操作 即 python 或 javascript 以及我将如何执行此操作 相关说明 有什么方法可以让 javascript
  • wordpress is_home() || is_index() 可能吗?

    我在 header php 中有一个测试 看看我们是否在家显示英雄 div class inner clearfix div 但是当用户登陆index php时 英雄并没有被显示 显然没有 is index 条件 有谁知道我如何测试它的主页
  • 如何使用 Json.Net (newtonsoft) 连接两个 Json 对象[重复]

    这个问题在这里已经有答案了 我想将一些 JSON 对象连接成一个 JSON 对象 如何使用 NewtonSoft 的 JSON 包来做到这一点 Use JContainer Merge 将 JSON 对象组合在一起的逻辑相当简单 名称 值被
  • 在哪里可以找到 Perl 编程语言的形式语法?

    我知道 Perl 语法是不明确的 并且它的消歧是不平凡的 有时涉及在编译阶段执行代码 http www modernperlbooks com mt 2009 08 on parsing perl 5 html 无论如何 Perl 是否有正
  • Firestore 安全规则 - 查询集合时检查文档字段

    当查询文档集合并使用安全规则检查文档上的字段以允许读取时 我得到 Uncaught Error in onSnapshot Error Missing or insufficient permissions 我的查询 firebase fi
  • 使用反射获取 Kotlin 中带注释的函数列表

    我是 Kotlin 新手 我想做以下事情 用注释来注释一些函数 例如 可执行文件 运行时 获取带有该注解的所有函数 检查注释上的属性 如果它与条件匹配 则调用该函数 我有以下代码 annotation class Executable va
  • 使用模板时初始化数组

    假设我有课Foo 以下工作正常 class Foo public const int bar Foo bar new int 2 1 2 但是 我尝试稍微更改一下以使用模板 template
  • 在 Gulp 任务中获取相对源/目标

    假设我有一个文件 Users me app src scripts foo js 我设置了一个 gulp 任务 将该文件写入 Users me app dist scripts foo js gulp src src scripts foo
  • 将 google 字体 (fonts.googleapis.com) 添加到 CSP 标头

    我在 gitHub 页面上托管一个个人项目 并使用 cloudflare 强制执行 https 现在我想实施 CSP 政策 我尝试将元标记添加到页面的头部 但我收到以下错误 拒绝加载样式表 https fonts googleapis co
  • VB 按住按键

    我正在创建一个宏程序来记录和回放鼠标和键盘输入 录音效果很好 鼠标播放也很好 但我在播放键盘输入时遇到了麻烦 特别是在释放之前按住某个键几秒钟 这并不等同于重复按键 这是我尝试过的 技术 1 Me KeyDown Private Sub k