ControlSend 使用 SetKeyDelay, 0, 0 时随机发送错误字符(修改和未修改)

2024-01-01

我正在自我回答这个问题,因为我在互联网上看到过这个问题,但几乎没有有用的答案,而且在 Stack Overflow 上也绝对找不到我能找到的解决方案。

示例代码

考虑一下这段代码,它只写了几行 shell 命令:

^0::
    SetKeyDelay, 0, 0
    myWindow = ahk_exe Notepad.exe
    ControlSend, , set c=".cshrc-andrew.cheong"`n, %myWindow%
    ControlSend, , set v=".vimrc-andrew.cheong"`n, %myWindow%
    ControlSend, , foreach d ( /userhome/andrew.cheong /home/$USER /data/$USER )`n, %myWindow%
    ControlSend, , if ( -e $d/$c ) source $d/$c`n, %myWindow%
    ControlSend, , if ( -e $d/$v ) alias vim "vim -N -u $d/$v"`n, %myWindow%
    ControlSend, , end`n, %myWindow%
    Return

I'm writing the commands to Notepad to show that it is not an issue limited to terminal applications like PuTTy or xterm. It's easy to think so, since these applications sometimes have laggy behavior.

示例输出

具体使用时SetKeyDelay, 0, 0为了快速“打字”,我会遇到各种奇怪的行为,例如:

  • 双引号替换为单引号。括号被 9 和 0 替换。美元符号被 4 取代。

    set c=".cshrc-andrew.cheong'
    set v=".vimrc-andrew.cheong"
    foreach d ( /userhome/andrew.cheong /home/$USER /data/$USER )
    if 9 -e 4d/4c 0 source 4d/4c
    if ( -e $d/$v ) alias vim 'vim -n -u 4d/4v'
    end
    
  • 破折号替换为下划线。案例变化。

    set c='.cshrc-andrew.cheong"
    set v='.vimrc-andrew.cheong'
    foreach d ( /userhome/andrew.cheong /home/4user /data/$USER )
    if 9 -e 4d/$C ) source 4d/$c
    if 9 _e $d/$v ) alias vim 'vim -N -u $d/$v"
    end
    
  • 句点替换为 > 。更多案例变化。

    set c=".cshrc-andrew.cheong"
    set v=">VIMrc-andrew.cheong"
    foreach d ( /userhome/andrew.cheong /home/$USER /data/$USER )
    if 9 -e $d/$c ) source 4d/$c
    if ( -e $d/$V ) alias vim "vim -N -u $d/$v"
    end
    

It's obvious the issue has something to do with the Shift modifier, as if it's being randomly turned on or off.

为什么会发生这种情况,我们该如何解决?

注意使用时没有问题Send及其变体。这个问题具体出现在ControlSend,需要将输入发送到特定控件或未聚焦的窗口。


Solution

将其复制到您的脚本中(来自 AutoHotkey 论坛上的用户 RHCP):

pSendChars(string, control := "", WinTitle := "", WinText := "", ExcludeTitle := "", ExcludeText := "")
{
    for k, char in StrSplit(string)
        postmessage, WM_CHAR := 0x102, Asc(char),, %Control%, %WinTitle%, %WinText%, %ExcludeTitle%, %ExcludeText%
    return
}

并像这样使用它:

^0::
    myWindow = ahk_exe Notepad.exe
    line .= "set c="".cshrc-acheong""`n"
    line .= "set v="".vimrc-acheong""`n"
    line .= "foreach d ( /userhome/andrew.cheong /home/cama /home/$USER )`n"
    line .= "    if ( -e $d/$c ) source $d/$c`n"
    line .= "    if ( -e $d/$v ) alias vim ""vim -N -u $d/$v""`n"
    line .= "end`n"
    pSendChars(line, "edit1", myWindow)
    Return

就是这样。

Note that edit1 is Notepad's name for its text control. When using this script for PuTTy, I changed it to a blank string. Use AutoHotkey's WindowSpy program to find out the control you wish to write to.

Why

这个问题之前已经出现过几次了。只是为了添加 Lexikos 的内容 写道,问题是由于 controlSend 使用了 post message 和 sendInput/sendEvent 来发送击键。这是必需的 因为某些程序将无法正确解释击键,除非 发送的修饰键在逻辑上是向下的(通过 sendInput/Event 发送)。

发送修饰键(除非明确说明,例如 {shitft down}) 通过 sendInput,而非修饰符通过 postMessage 发送。钥匙已发送 通过 postmessage 直接发送到窗口,因此延迟较少 比其他键/消息。因此,击键是可能的 消息不同步到达,导致出现意外字符。在 您的情况,大写字母需要通过 Shift 键发送 发送输入/事件。

除了使用keyDelays之外,您还可以尝试controlSetText和posting WM_Char 消息。如果您正在使用文本控件,我会 推荐使用controlSetText。

- RHCP 于 2013 年 9 月 30 日 https://autohotkey.com/boards/viewtopic.php?p=38107#p38107

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ControlSend 使用 SetKeyDelay, 0, 0 时随机发送错误字符(修改和未修改) 的相关文章

随机推荐

  • 带有 CSS 的纹理文本?

    我目前正在开发一个简单的页面 有谁知道有什么方法可以将纹理图像覆盖在文本上吗 目前的规格似乎不可能 但请告诉我这是否可能 谢谢并保重 不知道为什么没有人回答这个问题 这可以使用background clip https codepen io
  • 指定 Tkinter 文本框的尺寸(以像素为单位)

    如何使用像素指定 Tkinter 文本框的尺寸 我不想改变字体大小 我用它来帮助我将其缩放到窗口的大小 您可以通过将其放入框架内 通过停用尺寸传播并配置条目以粘贴到框架边框来强制框架为固定尺寸来实现此目的 pack 也应该以类似的方式工作
  • 屏幕上和变量中的调用表达式输出

    我正在尝试存储来自的输出Invoke expression到变量以及屏幕上 我有 PS 日志记录 它会自动将所有内容记录为Write Host在一个文件中 现在我正在使用Invoke Expression这似乎要么在屏幕上打印输出 要么打印
  • 对 pandas MultiIndex 数据帧进行重新采样

    我有一个类似于以下内容的 pandas MultiIndex 数据框 import pandas as pd rows One One One 20120105 1 Text1 One One One 20120107 2 Text2 On
  • swift ios 键盘扩展 - 长按/按住

    我需要知道如何向 ios 自定义键盘扩展添加长按 按住 功能 以便我可以显示多个键以从中选择一个 expected design 我的项目结构 按键操作的当前代码 代码可以将按下的按钮的标题作为新文本添加到任何代理文本字段中 IBActio
  • Xcode PhoneGap 本地化

    这两天我一直在努力尝试向我的应用程序添加特定于语言的本地化 该应用程序正在使用 PhoneGap 1 1 我正在尝试使用 XCode 4 1 构建它 两天以来我一直在寻找信息 教程 其他内容 但找不到任何详细信息 所以 要么这是一个微不足道
  • XStream解析没有根节点的JSON

    我目前正在使用 XStream 反序列化 JSON 并且效果很好 但是 当我有如下所示的 JSON 字符串时 key1 an object something foobar key2 another object data hi 最值得注意
  • 在哪里放置模型数据和行为? [tl;博士;使用服务]

    我正在使用 AngularJS 来完成我的最新项目 在文档和教程中 所有模型数据都放入控制器范围内 我知道它必须可供控制器使用 因此必须在相应的视图中 但我认为该模型实际上不应该在那里实施 例如 它可能很复杂并且具有私有属性 此外 人们可能
  • 将文本框绑定到comboBox.SelectedItem 的属性

    我正在使用 winforms 并且有一个代表 IQueryable 的组合框 组合框下方是一系列文本框 我希望将它们绑定到组合框中当前选择的文本框 这是我的代码 public partial class TestForm Form publ
  • 如何访问 keras 中单个自定义损失函数的所有输出

    我正在尝试重现中提出的网络架构本出版物 https www sciencedirect com science article pii S0031320319302031在张量流中 作为一个完全的初学者 我一直在使用本教程 https ww
  • 如何在使用 Component Creator 构建的 Joomla 3.x 组件的一个视图中包含多个模型

    Joomla 组件使用 MVC 模型 Component Creator 是一种广泛使用的工具 其付费级别支持通过 SQL 导入创建多表视图 此外 开发人员根据 Joomla 文档从头开始构建组件 我想构建一个高级组件 充当 仪表板 显示来
  • Python:从字符串中提取多个浮点数

    请原谅我 我是 Python 新手 给定一个以不确定长度的浮点数开头并以相同长度结尾的字符串 我如何将它们都提取到一个数组中 或者如果只有一个浮点数 则只有一个 例子 38 00 SALE 15 20 69 99 我想返回 38 00 15
  • 计算 AP 的距离,包括信噪比

    出于某种原因 我和一个朋友正在讨论根据从设备获取的信息 RSSI 频率 SNR 等 计算您自己 笔记本电脑 手机等 与 AP 之间的距离 因此 在花了一些时间研究三边测量 三角测量和自由空间路径损耗之后 在一些博客文章和 wiki 的帮助下
  • bootstrap-affix :affix 下面的 Div“跳”到顶部。如何让它平滑地向后滚动?

    已经使用 bootstrap 几天了 并对它提供的功能感到惊讶 一直在尝试拥有某种 标题 当用户向下滚动时将其固定在顶部 您可以在这里找到我当前的工作 http mp3dj free fr affix site http mp3dj fre
  • 比较 SynchronizationContext

    如何比较 SynchronizationContext 看来同一个Dispatcher在使用BeginInvoke时可以创建不同的SynchronizationContext 当我深入研究两个 不相等的 上下文时 我发现调度程序线程 ID
  • 在记事本++中创建新快捷方式

    我正在尝试在记事本 中添加快捷方式或按钮来调用我当前正在编辑的文件上的外部程序 例如 假设我有程序 analyzer jar 我想在记事本 中创建一个按钮 或快捷方式 来直接运行命令 cmd K java jar analyzer jar
  • 在 AWS EC2 上添加新的 Spark 工作线程 - 访问错误

    我有现有的正在运行的 Spark 集群 它是通过以下方式启动的spark ec2脚本 我正在尝试按照说明添加新的从站 停止集群 在 AWS 控制台上 在其中一个从属设备上 启动更多这样的操作 启动集群 尽管新实例已添加到同一安全组 并且我可
  • Y 轴中带有长标签的 Recharts 水平条形图的动态高度

    如果 YAxis 中的标签太长 如何动态更改 Recharts 中的 ResponsiveContainer 的高度 这是我的代码
  • 错误:打开模拟器时,在 Windows 8 上找不到抛出的模拟器图像 (avds)

    我正在 ionic 框架中制作一个 cordova 应用程序 我想在模拟器 somfired 命令中测试它ionic emulate android它引发了以下错误 运行命令 ionic emulate android 时 Git Bash
  • ControlSend 使用 SetKeyDelay, 0, 0 时随机发送错误字符(修改和未修改)

    我正在自我回答这个问题 因为我在互联网上看到过这个问题 但几乎没有有用的答案 而且在 Stack Overflow 上也绝对找不到我能找到的解决方案 示例代码 考虑一下这段代码 它只写了几行 shell 命令 0 SetKeyDelay 0