1

Я пытаюсь сопоставить жест касания 3 пальца на сенсорной панели с Ctrl+Win+Left или Ctrl+Win+Right (переключение между виртуальными рабочими столами). Вот клавиши, которые нажимаются, когда я провожу пальцем влево:

VK  SC  Type    Up/Dn   Elapsed Key     Window
-------------------------------------------------------
A2  01D a   d   1.08    LControl        
A4  038 a   d   0.00    LAlt            
09  00F a   d   0.00    Tab             
09  00F a   u   0.00    Tab             
A4  038 a   u   0.00    LAlt            
A2  01D a   u   0.00    LControl        
0D  01C a   d   0.20    Enter           Task Switching
0D  01C a   u   0.00    Enter   

И когда я проведу вправо

VK  SC  Type    Up/Dn   Elapsed Key     Window
-----------------------------------------------
A2  01D a   d   1.69    LControl        
A4  038 a   d   0.00    LAlt            
A0  02A a   d   0.00    LShift          
09  00F a   d   0.00    Tab             
09  00F a   u   0.00    Tab             
A0  02A a   u   0.01    LShift          
A4  038 a   u   0.00    LAlt            
A2  01D a   u   0.00    LControl        
0D  01C a   d   0.16    Enter           Task Switching
0D  01C a   u   0.00    Enter  

Как мне сопоставить их с Ctrl+Win+Left и Ctrl+Win+Right?

Я пробовал этот Alt & Ctrl & Enter & Tab::Send test , но он говорит, что это неверная программа.

В случае необходимости я использую Windows 10 на Thinkpad L440 с драйвером тачпада Synaptics.

2 ответа2

0

Enter выбор основан на диалоге? Если так, то это не будет отправлено как часть автоматизации.

Я полагаю, что следующий код должен генерировать перечисленные кейлоги, но не проверяться ...

^#Left::
    SendInput ^!{Tab}
    SendInput {Enter}    ; use only if needed
Return

^#Right::
    SendInput ^!+{Tab}
    SendInput {Enter}
 Return

Посмотрите в файлах справки список ключей и список модификаторов

^ = Control
! = Alt
# = Win
+ = Shift

Кроме того, если это новая особенность Windows 10, то клавиши могут работать не совсем так, как вам нужно, и вам может потребоваться использовать AltTab и ShiftAltTab с модификатором клавиши управления. В предыдущих версиях окон эти комбинации могут иметь особое поведение, поэтому существует особый случай (см. AltTab в файлах справки).

Вы также можете попробовать нажать клавиши вручную, чтобы увидеть, делает ли он то, что делает свайп. Если попытка сделать это вручную работает, то нажатия клавиш AutoHotkey должны работать без необходимости использовать что-то особенное. То есть попробуйте нажать Ctrl+Alt+Tab (вниз, вверх), а затем Enter (вниз, вверх) или Shift+Ctrl+Alt+Tab (вниз, вверх), а затем Enter (вниз, вверх). Это то, на что указывают журналы нажатия клавиш с символами d и u .

РЕДАКТИРОВАТЬ...

Основываясь на последующем посте, я понимаю, почему приведенный выше код является функционально обратным (изначально я не до конца понял вопрос, но оставлю свой оригинальный пост выше как есть).

Отвечая на вопрос о "лучшем методе", размещенный код уже выглядит великолепно и очень прост (нет причин действительно его менять)- две возможные разницы в стиле ниже приведены лишь для того, чтобы показать некоторые возможные варианты ответа на вопрос. -код, который может быть "чище" с использованием встроенных переменных горячих клавиш и троичных операторов.

Во-первых, переменные горячих клавиш A_ThisHotkey и A_PriorHotkey можно использовать для обнаружения текущей горячей клавиши и последней горячей клавиши, которая сработала. Это позволяет упростить присвоение переменной, избавившись от переменной, используемой для отслеживания, которая сработала последней. Определения горячих клавиш все еще должны быть на месте, чтобы событие регистрировалось и отбрасывалось, но теперь им не нужно ничего делать, кроме возврата.

^!Tab::return
^!+Tab::return
$Enter::
    if (A_PriorHotkey="^!Tab") {
        SendInput ^#{Left}
    } else if (A_PriorHotkey="^!+Tab") {
        SendInput ^#{Right}
    } else
        SendInput {Enter}
return

Вы можете видеть, как это выглядит немного проще и уже менее распространено.

Последний вариант заключается в использовании тернарного оператора для эффективного выполнения оператора If-Then-Else и объединения всего в один оператор:

^!Tab::Return
^!+Tab::Return
$Enter::SendInput % (A_PriorHotkey="^!Tab") ? "^#{Left}" : (A_PriorHotkey="^!+Tab") ? "^#{Right}" : "{Enter}"       ; Final 'Else' Statement

До трех строк кода, но не самый читаемый.

Используя одно окончательное разрешение AutoHotkey, одну строку можно разделить с помощью операторов автоматического продолжения, когда строки начинаются с запятой, двоеточия или точки для объединения строк ... это позволяет использовать логические разрывы строк и создает довольно симпатичные очистить структуру If-Then-Else с тройной ? оператор, не имея кучу операторов If-Then-Else-Else-Else.

Окончательный код будет выглядеть примерно так ...

^!Tab::return
^!+Tab::return
$Enter::SendInput % (A_PriorHotkey="^!Tab")  ? "^#{Left}"
                  : (A_PriorHotkey="^!+Tab") ? "^#{Right}"
                  : "{Enter}"    ; Final 'Else' Statement

Или с альтернативным интервалом в последнем 'Else', чтобы все аргументы Send были выровнены по вертикали ...

^!Tab::return
^!+Tab::return
$Enter::SendInput % (A_PriorHotkey="^!Tab")  ? "^#{Left}"
                  : (A_PriorHotkey="^!+Tab") ? "^#{Right}"
                                             : "{Enter}"      ; Final 'Else' Statement

И последнее замечание: на самом деле я не могу протестировать приведенные выше выдержки из кода, хотя считаю, что они должны работать так, как указано. Все они, как уже отмечалось, являются просто обновлениями стиля (т. Е. Обновлениями последующего кода, опубликованными уже пользователем, который разместил исходный вопрос)- в конечном итоге функциональных различий нет, лишь некоторые функции, которые предлагает AutoHotkey, если вы продолжите разработку.

0

После часа или двух переделок я понял это:

swipeDirection := ""

^!Tab::
    swipeDirection := "L"
return

^!+Tab::
    swipeDirection := "R"
return

$Enter::
    if (not swipeDirection) {
        SendInput {Enter}
    } else if (swipeDirection = "L") {
        SendInput ^#{Left}
    } else if (swipeDirection = "R") {
        SendInput ^#{Right}
    }
    swipeDirection := ""
return

Дайте мне знать, если есть лучший метод!

Редактировать:

Я написал об этом в своем блоге: https://www.wptutor.io/misc/windows-virtual-desktop-swipe-gestures

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .