【问题标题】:SendInput %userInput% causes my computer to malfunction oddlySendInput %userInput% 导致我的计算机出现异常故障
【发布时间】:2015-07-29 15:18:21
【问题描述】:

SendInput %userInput% 导致我的计算机执行非常奇怪的操作。有时它会注销,有时我的键盘箭头会被禁用,有时它会在 Windows 中无限次运行 cmd...

更新: 这是在命令行中输入并运行的内容: runas /user:administrator cmd

更新: 我想我几乎遇到了问题,因此我编辑了问题以省略我现在认为不相关的内容。
当 SendInput 发生时,而用户仍在键盘上输入数据,例如按下 win-key,那么这可能会导致系统注销,因为 win-key + l 是一个快捷键。对于正在发生的所有其他事情也必须如此。另一个观察结果是 SendInput 会跳过某些字符,例如 {enter} 等。它只在最后处理它们,当所有常规字符都放置到位时。我注意到最后,SendInput 仍然忙于做一些事情,也许是一些奇异的字符延迟到最后。因为用户认为输出已经完成,所以他再次按下快捷键,结合当前的sendInput导致系统崩溃。

更新:
如果有一个“!”,它也会变得很糟糕。使用 SendInput 发送。
这是我粘贴到电子白板上的一个字符串:
dsjkfhjdsfsjdh!!!!!!!!!!!!@@@@@@@@############$$$$$$$$$$$%%%%%%% %%^^^^^^^^^^^^&&&&&&&&&&&&*****(((((((( (())))))))))))____++++++++++++ ++++=======------------000000000000000099999988888。

但是输出没有感叹号。像这样:
dsjkfhjdsfsjdh@@@@@@@$$$$$$$$$$%%%%%%%%%&&&&&&&&&&&&***** (((((((((())))))))))))____ +======------------000000000000000099999988888。

这是为什么呢?还有其他角色吗?我觉得感叹号很重要,我不想删除它们。有什么解决方法吗?

更新: 它比这更复杂。当我复制粘贴上面没有感叹号的字符时,它仍然会做一些奇怪的事情。
下面是一些最终 userInput 与 SendInput 组合并发送出去的代码:

StringReplace, contents, save_selection, ``, ````, All        ; Do this replacement first to avoid interfering with the others below.

StringReplace, contents, contents, `r`n, %A_SPACE%, All       ; Using `r works better than `n in MS Word, etc.
StringReplace, contents, contents, `;, ```;, All             
;* loc_title origanally contains browser specification. Remove it.
StringGetPos, pos_delim, loc_title, - , R
length := StrLen(loc_title)
count := length - pos_delim
StringTrimRight, loc_title, loc_title, count

【问题讨论】:

  • 内容存储在我上面提到的ini文件中。奇怪的是,即使我重新启动并且除了通过使用热键粘贴该文件的内容来读取该文件之外不执行任何操作,它也会变得狂暴。第一次可以贴。第二次发狂。
  • 我想我现在可以通过询问来减少这个问题:只要 SendInput 正在进行,我如何防止任何进一步的 UserInput 发生?我不认为这很困难。困难的是我要找出哪些隐藏字符仍在输出,以便我可以过滤掉它们?
  • 命令 SendInput %userinput% 将处理 userinput 变量中的值并将其作为键盘命令发送到 Windows。听起来您的问题在您的脚本中较早地设置了用户输入。需要设置用户输入的代码来调试问题。您可以使用 BlockInput 命令阻止输入。 Win+L 不会让您退出,它只是锁定帐户。
  • blockinput 不起作用,因为我有 win 7,所以它只适用于管理员权限。我尝试了管理员破解,但在我的电脑上找不到文件 shellexecute。

标签: autohotkey


【解决方案1】:

您可以使用sendraw 代替sendinput

文档是这样说的:

Raw 模式:SendRaw 命令解释所有字符字面意思 而不是将 {Enter} 翻译成 ENTER 键击, ^c 到 Control-C 等。但是,转义序列的正常规则, 变量引用和表达式仍然适用,因为它们是 在命令执行之前处理。要将原始模式与 SendInput 一起使用, SendPlay 或 SendEvent,将 {Raw} 写为字符串中的第一项; 例如:SendInput {Raw}abc.

那么您不必担心! 或其他控制修饰符。

【讨论】:

    【解决方案2】:

    感叹号出现问题的原因是SendInput将其视为按下Alt键的代码。

    有几个类似的代码:
    ^ = Ctrl
    + = Shift
    # = Windows键

    您可以找到SendInput 的文档中列出的其他人。

    您似乎想发送原始文本,而不是让SendInput 查找这些代码。您应该可以将{Raw} 放在userinput 变量的开头,它将忽略其余字符中的任何代码。

    如果输入太慢,您可以在脚本中输入SetKeyDelay,-1 以消除密钥发送延迟。

    【讨论】:

      【解决方案3】:

      我发现一个很好的解决方法是完全避免 SendInput。而是使用剪贴板复制其中的字符串,然后将其粘贴到屏幕上。它完美无缺,速度快了十亿倍。为什么一个人会首先使用 SendInput?然而,实际的问题仍然存在,为什么 SendInput 的行为如此奇怪?该字符串中的内容是什么:导致我的系统崩溃的%userInput%?我怎样才能知道?

      【讨论】:

      • 一个人会使用sendsendinput 如果他:1) 想保留剪贴板的内容,2) 他已经在使用剪贴板做其他事情,3) 他担心关于安全。快十亿倍?我不太确定。此外,您不能使用剪贴板发送窗口+组合键 - 或任何其他组合键。另外,Khalil,您发布了一个答案 - 如果您想提出问题,请启动一个新线程。
      • @BGM 非常感谢您的回答。关于您的最后评论,答案为我提供了一种解决方法,在没有更好的替代方案可用时对我有帮助,并且只是重申了相同的问题。为什么鼓励为此开辟一个新线程?我检查了帮助部分,但找不到任何有用的说明。
      • 嗯,你说,“问题仍然存在......”之后你以一个问题结束你的回答 - 这与提出问题相同。在您接受某人的回答之前,您的原始问题仍然存在(即使这是您自己的回答)。无论如何,这个“讨论”超出了这里的范围,如果我们在这里继续讨论,我们会遇到“麻烦”(这实际上是对元站点的讨论,你知道)。
      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2021-01-29
      相关资源
      最近更新 更多