Пользуясь AutoIt3, там есть отличная функция "Send", которая в окна может выслать текст, выслать горячую клавишу, поддерживает текстовые названия модификаторов индивидуально нажатие и отпуск и переключение. Решил посмотреть если она в PureAutoIt и оказалось есть, там её код на 500 строк и вычленить всю я вначале хотел в отдельный pbi, но решил что код слишком длинный, а в моих целях требовался только хоткей для выделения текста в окне ввода, копирования и вставки. Решил упростить вычленив только нужное и получилось.
EnableExplicit
Global SendKeyDelay = 5
Global SendKeyDownDelay = 5
EnumerationBinary
#MOD_LALT = #MOD_ALT
#MOD_LCONTROL = #MOD_CONTROL
#MOD_LSHIFT = #MOD_SHIFT
#MOD_LWIN = #MOD_WIN
#MOD_RALT
#MOD_RCONTROL
#MOD_RSHIFT
#MOD_RWIN
EndEnumeration
#KEYEVENTF_UNICODE = 4
Macro IIf(expr, truepart)
If expr
truepart
EndIf
EndMacro
Procedure keybd_event_send(vk.a, flag.l, extra.i = 0)
Protected input.INPUT
input\type = #INPUT_KEYBOARD
input\ki\wVk = vk
input\ki\wScan = MapVirtualKey_(vk, #MAPVK_VK_TO_VSC)
input\ki\dwFlags = flag
input\ki\dwExtraInfo = extra
SendInput_(1, @input, SizeOf(INPUT))
EndProcedure
; Only left shift, left ctrl, and left alt don't need EXTENDEDKEY
Procedure SendModifier(modifier.u, type.l = 0)
Macro SendModifierNoExt(vk)
keybd_event_send(vk, type)
Delay(SendKeyDelay)
EndMacro
Macro SendModifierExt(vk)
keybd_event_send(vk, type | #KEYEVENTF_EXTENDEDKEY)
Delay(SendKeyDelay)
EndMacro
IIf(modifier & #MOD_LSHIFT, SendModifierNoExt(#VK_LSHIFT))
IIf(modifier & #MOD_RSHIFT, SendModifierExt(#VK_RSHIFT))
IIf(modifier & #MOD_LCONTROL, SendModifierNoExt(#VK_LCONTROL))
IIf(modifier & #MOD_RCONTROL, SendModifierExt(#VK_RCONTROL))
IIf(modifier & #MOD_LALT, SendModifierNoExt(#VK_LMENU))
IIf(modifier & #MOD_RALT, SendModifierExt(#VK_RMENU))
IIf(modifier & #MOD_LWIN, SendModifierExt(#VK_LWIN))
IIf(modifier & #MOD_RWIN, SendModifierExt(#VK_RWIN))
EndProcedure
Procedure SendKey(vk.a, modifier.u, extend = 0)
SendModifier(modifier, 0)
keybd_event_send(vk, extend)
Delay(SendKeyDownDelay)
keybd_event_send(vk, #KEYEVENTF_KEYUP | extend)
Delay(SendKeyDelay)
SendModifier(modifier, #KEYEVENTF_KEYUP)
EndProcedure
Ранее я использвал keybd_event_() и это работало жутко, не понимал в чём была проблема. Потом нашёл код с использованием SendInput_() тут, стало работать нормально, но теперь точно буду использовать AutoIt3-вариант кода. Здесь можно выслать с модификатором или одиночное нажатие клавиши, без необходимости городить последовательности нажатий клавиш и отпуска.
Пример
XIncludeFile "SendKey.pbi"
Global g_Key.INPUT
g_Key\type = #INPUT_KEYBOARD
Procedure ReleaseKey()
While GetAsyncKeyState_(#VK_SHIFT)
g_Key\ki\wVk = #VK_SHIFT
g_Key\ki\dwFlags = #KEYEVENTF_KEYUP
SendInput_( 1, @g_Key, SizeOf(INPUT))
Delay(10)
Wend
While GetAsyncKeyState_(#VK_CONTROL)
g_Key\ki\wVk = #VK_CONTROL
g_Key\ki\dwFlags = #KEYEVENTF_KEYUP
SendInput_( 1, @g_Key, SizeOf(INPUT))
Delay(10)
Wend
While GetAsyncKeyState_(#VK_MENU)
g_Key\ki\wVk = #VK_MENU
g_Key\ki\dwFlags = #KEYEVENTF_KEYUP
SendInput_( 1, @g_Key, SizeOf(INPUT))
Delay(10)
Wend
EndProcedure
ReleaseKey()
SendKey(#VK_LEFT, #MOD_LCONTROL | #MOD_LSHIFT)Функцию ReleaseKey() я сделал из предыдущего варианта и не стал переделывать. Она посылает отпуск клавиш перед тем как выслать, так как Send иногда вызывает заливание клавиш модификаторов, поэтому всегда сначала проверить отпущены ли они и если нет, и если нет посылать отпуск пока не отпустит.
Отредактировано AZJIO (20.02.2022 20:17:32)