0

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
4

3 回答 3

3

您可以使用sendraw而不是sendinput.

这是文档所说的:

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

然后您不必担心!或其他控制修饰符。

于 2013-08-10T15:20:25.927 回答
2

感叹号字符是一个问题的原因是因为SendInput将其视为Alt按键的代码。

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

您可以在SendInput的文档中找到列出的其他内容。

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

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

于 2013-08-09T21:15:12.073 回答
-4

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

于 2013-08-07T09:46:11.383 回答