Post by killmatt01 » 29 Jul 2021, 20:31
目前已经测试成功一种方式:
Code: Select all
DllCall("keybd_event", "Int", VirtualKey, "Int", ScanCode, "Int", 1, "Int", 0)
DllCall("keybd_event", "Int", VirtualKey, "Int", ScanCode, "Int", 2, "Int", 0)
但由于这个函数(keybd_event)已经被取代了,我想尝试最新的SendInput函数但遇到了问题
尝试如下:
Code: Select all
~*1::
press_key("Space")
Return
press_key(key_name)
{
VarSetCapacity(Key_Down, 40)
VarSetCapacity(Key_Up, 40)
static INPUT_KEYBOARD := 1, KEYEVENTF_EXTENDEDKEY := 0x0001, KEYEVENTF_KEYUP := 0x0002
VirtualKey := GetKeyVK(key_name)
ScanCode := GetKeySC(key_name)
NumPut(INPUT_KEYBOARD, Key_Down, "UInt")
NumPut(VirtualKey, Key_Down, A_PtrSize, "UShort")
NumPut(ScanCode, Key_Down, A_PtrSize+4, "UShort")
NumPut(INPUT_KEYBOARD, Key_Up, "UInt")
NumPut(VirtualKey, Key_Up, A_PtrSize, "UShort")
NumPut(ScanCode, Key_Up, A_PtrSize+4, "UShort")
NumPut(KEYEVENTF_EXTENDEDKEY, Key_Down, A_PtrSize+4*3, "UInt")
DllCall("SendInput", "UInt", 1, "Ptr", &Key_Down, "Int", 40)
sleep, 100
VarSetCapacity(Key_Down, 0)
NumPut(KEYEVENTF_KEYUP, Key_Up, 2*A_PtrSize+4*3, "UInt")
DllCall("SendInput", "UInt", 1, "Ptr", &Key_Down, "Int", 40)
sleep, 100
VarSetCapacity(Key_Up, 0)
}
至于尝试DllCall方式的缘由:我当然知道可以直接用
Code: Select all
key := "Space" ;等等等等
Send, {%key% Down}
Send, {%key% Up}
来模拟,但这种方式在非管理员权限的窗口里有些慢,在我电脑上send函数每行需要40ms,哪怕
Code: Select all
SetBatchLines, -1
SetKeyDelay, -1, -1
因为在此寻求帮助,提前感谢!
目前已经测试成功一种方式:
[code]
DllCall("keybd_event", "Int", VirtualKey, "Int", ScanCode, "Int", 1, "Int", 0)
DllCall("keybd_event", "Int", VirtualKey, "Int", ScanCode, "Int", 2, "Int", 0)
[/code]
但由于这个函数(keybd_event)已经被取代了,我想尝试最新的SendInput函数但遇到了问题
尝试如下:
[code]
~*1::
press_key("Space")
Return
press_key(key_name)
{
VarSetCapacity(Key_Down, 40)
VarSetCapacity(Key_Up, 40)
static INPUT_KEYBOARD := 1, KEYEVENTF_EXTENDEDKEY := 0x0001, KEYEVENTF_KEYUP := 0x0002
VirtualKey := GetKeyVK(key_name)
ScanCode := GetKeySC(key_name)
NumPut(INPUT_KEYBOARD, Key_Down, "UInt")
NumPut(VirtualKey, Key_Down, A_PtrSize, "UShort")
NumPut(ScanCode, Key_Down, A_PtrSize+4, "UShort")
NumPut(INPUT_KEYBOARD, Key_Up, "UInt")
NumPut(VirtualKey, Key_Up, A_PtrSize, "UShort")
NumPut(ScanCode, Key_Up, A_PtrSize+4, "UShort")
NumPut(KEYEVENTF_EXTENDEDKEY, Key_Down, A_PtrSize+4*3, "UInt")
DllCall("SendInput", "UInt", 1, "Ptr", &Key_Down, "Int", 40)
sleep, 100
VarSetCapacity(Key_Down, 0)
NumPut(KEYEVENTF_KEYUP, Key_Up, 2*A_PtrSize+4*3, "UInt")
DllCall("SendInput", "UInt", 1, "Ptr", &Key_Down, "Int", 40)
sleep, 100
VarSetCapacity(Key_Up, 0)
}
[/code]
至于尝试DllCall方式的缘由:我当然知道可以直接用
[code]
key := "Space" ;等等等等
Send, {%key% Down}
Send, {%key% Up}
[/code]
来模拟,但这种方式在非管理员权限的窗口里有些慢,在我电脑上send函数每行需要40ms,哪怕
[code]
SetBatchLines, -1
SetKeyDelay, -1, -1
[/code]
因为在此寻求帮助,提前感谢!