Autohotkey 使用自动热键记录多个键
我正试图通过自动热键让比赛游戏进行。我使用这个脚本将我按下的键粘贴到一个txt文件中,让它们自动播放 我的问题是现在这个脚本只能记录一个键,例如{w down}用于向前驱动。但是为了更好地驾驶比赛,你必须按w和d向右行驶 如何更改代码以使其按我想要的方式工作Autohotkey 使用自动热键记录多个键,autohotkey,Autohotkey,我正试图通过自动热键让比赛游戏进行。我使用这个脚本将我按下的键粘贴到一个txt文件中,让它们自动播放 我的问题是现在这个脚本只能记录一个键,例如{w down}用于向前驱动。但是为了更好地驾驶比赛,你必须按w和d向右行驶 如何更改代码以使其按我想要的方式工作 $F1:: start := A_TickCount FileDelete, log.txt Loop { Input, key, L1 V, %endkeyslist% IfInString, ErrorLevel, EndKey: {
$F1::
start := A_TickCount
FileDelete, log.txt
Loop
{
Input, key, L1 V, %endkeyslist%
IfInString, ErrorLevel, EndKey:
{
StringTrimleft, key, ErrorLevel, 7
}
time := (A_TickCount - start)
start := A_TickCount
text1:="Sleep, " time "`n"
text2:="Send {" key " Down} `n"
FileAppend, %text1%, log.txt
FileAppend, %text2%, log.txt
KeyWait, %key% ;waits the key to be released
time := (A_TickCount - start)
start := A_TickCount
text1:="Sleep, " time "`n"
text2:="Send {" key " Up} `n"
FileAppend, %text1%, log.txt
FileAppend, %text2%, log.txt
}
return
$F2:: ExitApp
我建议使用
OnMessage()
来监视按键向下(0x100)和按键向上(0x101)事件消息。以下是相关帮助文档的一些链接:
下面是一个工作示例,它将在您的桌面上创建一个文件testEE.txt
,其参数与您正在记录的参数类似。请注意,这不会记录鼠标移动或单击(这是可能的,我只是没有这样设置)。按F1开始和停止录制
f1::
bT := !bT
If bT
{
MsgBox ,,, Recording started , 1
KeyBdHook := DllCall( "SetWindowsHookEx" , "int" , 13 , "uint" , RegisterCallback( "KeyBdProc" ) , "uint" , 0 , "uint" , 0 )
nStart := A_TickCount
} Else {
DllCall( "UnhookWindowsHookEx" , "ptr" , KeyBdHook )
MsgBox ,,, Recording terminated , 1
}
Return
KeyBdProc( nCode , wParam , lParam )
{
global
Critical
If ( wParam = 0x100 || wParam = 0x101 )
{
nKey := Format( "{:x}" , NumGet( lParam + 0 , 0 , "int" ) )
nTime := A_TickCount - nStart , nStart := A_TickCount
If ( wParam = 0x100 && nKey != nKeyPrev )
{
nKeyPrev := nKey
FileAppend , % nTime . "|" . nKey . " down`n" , %A_Desktop%/testEE.txt
}
If ( wParam = 0x101 )
{
If ( nKey = nKeyPrev )
nKeyPrev := ""
FileAppend , % nTime . "|" . nKey . " up`n" , %A_Desktop%/testEE.txt
} }
Return DllCall( "CallNextHookEx" , "uint" , KeyBdHook , "int" , nCode , "uint" , wParam , "uint" , lParam )
}
这将重播您的按键操作:
f2::
aData := []
FileRead , sText , %A_Desktop%/testEE.txt
Loop , Parse , sText , `n , `r
{
nCt := A_Index
Loop , Parse , A_LoopField , |
aData[ nCt , A_Index ] := A_LoopField
}
Loop , % aData.Length()
{
If InStr( aData[ A_Index , 2 ] , "70 " ) ; 0x70 is F1
Continue
Sleep , % aData[ A_Index , 1 ]
Send , % "{vk" . aData[ A_Index , 2 ] . "}"
}
Return
请注意,它还记录开始和停止录制的热键,因此如果它看到此键,我将其设置为“继续”。如果将热键更改为其他键或组合键,则需要将其设置为忽略该键或组合键
我发现这些帖子特别有用,可供参考:Thx为您提供快速帮助:D。但这并没有解决我的问题。。。我需要实现我可以一次记录多个按键,或者我自动格式化它:Sleep,31 Send{65 Down}{68 Down}Sleep,31 Send{65 Up}{68 Up}告诉我什么时候我没有得到it@Broump没问题。这会同时记录多个按键,但它的格式与您使用的格式不同。这只是如何使用
OnMessage()
的一个示例。要使格式符合您的要求,您需要将wParam
转换为虚拟密钥编号(KeyHistory
可以帮助您发现每个密钥的代码),并添加额外的文本(特别是text1
和text2
)。哦,谢谢,现在我看到了:)。你的翻译是什么意思?KeyHistory给我的数字与你的脚本不同。它是否可以使用这样的if语句:if(wPd==87){key=“w”}或者我必须使用不同的技术?Thx用于help@Broump通过翻译,我想把它从十进制转换成十六进制。我更新了代码并添加了另一个部分来读取它。我相信它完全可以满足您现在的需要。但它只在gui处于活动状态时记录键。我需要切换到游戏,那里的脚本没有记录任何东西。。。