SendInput%userInput%导致计算机出现故障

时间:2013-08-06 17:04:45

标签: autohotkey

SendInput%userInput%导致我的计算机做了非常奇怪的事情。有时它会注销,有时我的键盘箭头会被禁用,有时它会在窗口中运行cmd无限次......

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

更新: 我想我几乎遇到了问题,因此我编辑了这个问题,遗漏了我认为现在无关紧要的问题 当SendInput发生时,用户仍然在键盘上输入数据,例如按下win键,这会导致系统注销,因为win-key + l是一个快捷方式。同样必须适用于所有其他正在发生的事情。另一个观察是SendInput会跳过某些字符,例如{enter}等。它只会在所有常规字符到位时处理它们。我注意到最后,SendInput仍在忙着做东西,也许是一些异国情调的角色,它推迟到最后。因为用户认为输出已完成,所以他最终再次按下快捷键,这与当前的sendInput结合导致系统崩溃。

更新:
如果有“!”,它也会变成bezerk。与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

3 个答案:

答案 0 :(得分:3)

您可以使用sendraw代替sendinput

以下是文档的说法:

  

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

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

答案 1 :(得分:2)

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

有几个相似的代码:
^ = Ctrl
+ = Shift
# = Windows密钥

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

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

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

答案 2 :(得分:-4)

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