【问题标题】:How to send a block of text line-by-line in a hotstring?如何在热字符串中逐行发送文本块?
【发布时间】:2022-01-11 01:08:05
【问题描述】:

我有一个包含多行的文本块,并希望将其逐行发送到chap app。我想要这样的程序:

  1. 我输入一个热字串触发器(例如,hotstringtrigger),AutoHotKey 将发送第一行(文本应保留在聊天应用的输入框中)
  2. 我根据需要对其进行编辑
  3. 我按 Enter。聊天应用将发送文本,AutoHotKey 将发送下一行
  4. 返回 2 直到没有其他行了
  5. 在此之后 Enter 将正常运行,直到再次输入 hotstringtrigger

到目前为止,我的尝试是将其拆分为多个热字符串:

:*:hotstringtrigger::first line
:*:hotstringtrigger2::second line
:*:hotstringtrigger3::third line
...

但这有一些缺点:

  • 使用多个热字串
  • 有额外的按键

此页面似乎没有涵盖此内容:Hotstrings - Definition & Usage | AutoHotkey

【问题讨论】:

    标签: chat autohotkey


    【解决方案1】:

    我想非常简单直接的例子可能是这样的

    TextToSend := "
    (
    first line
    second line 
    )"
     
    lines := StrSplit(TextToSend, "`n", "`r")
     
     
    :*T:hotstringtrigger::
        SendInput,
        (
        Hello ____________________. Welcome to the World^{Home}{right 6}
        )
        
        i := 1
    return
     
    ~Enter::
        if (!i || i > lines.length())
            return
        
        SendInput, % "{Text}" lines[i]
        i++
    return
    

    这里的输入文本只是简单地输入到continuation section 并在脚本启动时从那里加载到array。运行所需的热字串时,索引 i 将被重置。

    然后在按下 Enter 时,会从数组中发送文本,直到我们的索引 i 大于输入字符串中的行数。

    如果您的输入文本有很长的行,您应该先将这些行加载到剪贴板,然后发送 Ctrl + v

    【讨论】:

    • 我在您的代码顶部添加了一个热字符串行,它工作正常。但是如果我有一个包含#If WinActive("ahk_class Notepad++") 的单独代码块,那么它只能在 Notepad++ 中工作,即使有一个return 来关闭该指令。你知道这是为什么吗?这是我的pastebin
    • 不确定你的意思。 #If 启动一个上下文相关的热键块,并且在遇到另一个相关的#directive 之前该块不会结束。也许您误解了上下文相关热键的工作原理? Here's 一个可能有帮助的例子。另外,你不应该使用#If, WinActive(),你应该使用#IfWinActive
    • 嗯,所以return 不像其他语言那样像右括号那样播放?这就解释了。今天我了解到要关闭#If 指令,您需要添加另一个#If
    • 可能很容易将return 视为阻止代码执行进一步的东西。 #IfDirectives 不关心returns,或任何与代码执行相关的东西,因为它们与代码执行无关。它们只是将代码的不同部分包含在其中的标记。
    • 也许你的意思是this?现在Enter 键正常运行,直到热字符串运行。并且运行热字符串总是会重置情况。
    【解决方案2】:

    尝试使用Array

    ; Create the array, initially empty:
    Array := [] ; or Array := Array()
    
    text =
    (
    first line
    second line
    third line
    )
    ; Write to the array:
    Loop, parse, text,`n
        Array.Push(A_LoopField) ; Append this line to the array.
    return
    
    
    F1::
    Index++ ; checks the number in the variable "Index" and increases it by 1 every time you press F1
    if (Index <= Array.MaxIndex())
        SendInput, % Array[Index]
    else
        MsgBox, No more lines.
    return
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2015-11-23
      • 2011-01-06
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多