Тема: AHK: Сочетания Shift и Alt в разных порядках
Подскажите, как реализовать следующее поведение:
{LAlt Down}{LShift Down}{LAlt Up}{LShift Up} без нажатий других клавиш:
Выбрать русскую раскладку
{LShift Down}{LAlt Down}{LShift Up}{LAlt Up} без нажатий других клавиш:
Выбрать английскую раскладку
Одиночное нажатие LAlt:
Послать !{/}
Одиночное нажатие LShift:
Послать {Esc}
Одиночное нажатие LShift при нажатом Alt:
Послать +!{/}
Одиночное нажатие LAlt при нажатом LShift:
Послать {F13}
Остальные сочетания с LAlt, LShift работают как обычно
Бьюсь уже часов 20, все что смог написать либо работает не так, либо адово глючит ,либо не работает вовсе.
Последний нерабочий концепт:
/*
Запуск всегда с максимальными правами
*/
if not A_IsAdmin
{
Run *RunAs "%A_ScriptFullPath%" ; Requires v1.0.92.01+
ExitApp
}
#SingleInstance, force
#NoEnv
SetWorkingDir %A_ScriptDir%
/*
Чтобы клавиши не залипали
*/
Process, Priority, , H
SetBatchLines, -1
SetKeyDelay, 50
SendMode Input
/*
Чтобы работало со всеми окнами
*/
DetectHiddenWindows, On
/*
~ посылает клавиши в окно
*/
~LAlt & ~LShift::
except_lalt_lsh := false
/*
Пока LAlt не отпущен - перебираем клавиши в поисках нажатой
*/
while ( GetKeyState("LAlt", "P") )
{
Loop, 256
{
key_with_lalt_lsh := Format("vk{:x}", A_Index-1)
/*
VK12=Alt VKA4=LAlt VK10=Shift VKA0=LShift
*/
if ( GetKeyState(key_with_lalt_lsh, "P")
&& key_with_lalt_lsh != "vk12" && key_with_lalt_lsh != "vka4"
&& key_with_lalt_lsh != "vk10" && key_with_lalt_lsh != "vka0" )
{
/*
Нажата клавиша кроме LAlt или LShift
*/
except_lalt_lsh := true
break 2
}
}
}
/*
Если не нажимались клавиши кроме LShift или LAlt, и LShift еще нажат
*/
if ( !except_lalt_lsh && GetKeyState("LShift", "P") )
{
/*
Ждем отпускания LShift и переключаем раскладку на Английскую
*/
KeyWait, LShift
ControlGetFocus, control, A
PostMessage 0x50, 0, -255851511, %control%, A
}
return
/*
~ посылает клавиши в окно
LAlt не посылается - иначе, отрываеся меню программ
*/
~LShift & LAlt::
except_lsh_lalt := false
/*
Пока LShift не отпущен - перебираем клавиши в поисках нажатой
*/
while ( GetKeyState("LShift", "P") )
{
Loop, 256
{
key_with_lsh_lalt := Format("vk{:x}", A_Index-1)
/*
VK10=Shift VKA0=LShift VK12=Alt VKA4=LAlt
*/
if ( GetKeyState(key_with_lsh_lalt, "P")
&& key_with_lsh_lalt != "vk10" && key_with_lsh_lalt != "vka0"
&& key_with_lsh_lalt != "vk12" && key_with_lsh_lalt != "vka4" )
{
/*
Нажата клавиша кроме LShift или LAlt
*/
except_lsh_lalt := true
break 2
}
}
lsh_single := false
}
/*
Если LShift & LAlt
не были задействованы ни в каких других сочетаниях
клавиш(в это время ни одна другая клавиша
не была нажата), - переключаем раскладку на Русскую
*/
if (!except_lsh_lalt)
{
ControlGetFocus, control, A
PostMessage 0x50, 0, -255785959, %control%, A
}
return
~$LShift::
lsh_single := true
/*
Пока LShift не отпущен - перебираем клавиши в поисках нажатой
*/
while ( GetKeyState("LShift", "P") )
{
Loop, 256
{
key_with_lshift := Format("vk{:x}", A_Index-1)
/*
VK10=Shift VKA0=LShift
*/
if ( GetKeyState(key_with_lshift, "P")
&& key_with_lshift != "vk10" && key_with_lshift != "vka0" )
{
lsh_single := false
break 2
}
}
/*
Если одиночный LShift удерживается дольше 300мс - Esc не будет послан
*/
if (A_TimeSinceThisHotkey > 300)
{
lsh_single := false
break
}
}
/*
Ждем отпускания LShift
*/
KeyWait, LShift
/*
Если LShift был зажат менее 300мс и
не был задействован в сочетании
клавиш(в это время ни одна другая клавиша не была нажата),
посылаем Esc
*/
if (lsh_single)
{
Send {Esc}
}
return
~$LAlt::
lalt_single := true
while ( GetKeyState("LAlt", "P") )
{
Loop, 256
{
key_with_lalt := Format("vk{:x}", A_Index-1)
/*
VK12=Alt VKA4=LAlt
*/
if ( GetKeyState(key_with_lalt, "P")
&& key_with_lalt != "vk12" && key_with_lalt != "vka4" )
{
lalt_single := false
break 2
}
}
if (A_TimeSinceThisHotkey > 300)
{
lalt_single := false
break
}
}
/*
Ждем отпускания LAlt
*/
KeyWait, LAlt
/*
Если LAlt был зажат менее 300мс и
не был задействован в сочетании
клавиш(в это время ни одна другая клавиша не была нажата),
посылаем {Alt Down}{/ Down}{/ Up}{Alt Up}
*/
if (lalt_single)
{
Send !{/}
}
return