AutoHotkey — сценарий перетаскивания тремя пальцами, вызывающий незначительную проблему, как исправить?

#windows-10 #autohotkey

#windows-10 #autohotkey

Вопрос:

Фон

У меня есть следующий скрипт AHK (полученный из https://medium.com/@dakshin.k1/enable-3-finger-gesture-for-click-and-drag-on-windows-and-linux-cd7165b66851):

 #NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force

; Enable three-finger drag
drag_enabled := 0

 ^#F22::
    if (drag_enabled) {
        Click up
        drag_enabled := 0
    } else {
        drag_enabled := 1
        Click down
    }
    return

LButton::
    if (drag_enabled) {
        Click up
        drag_enabled := 0
    } else {
        click
    }
    return
 

Предполагается, что это позволит перетаскивать тремя пальцами в стиле Mac на сенсорной панели любого ноутбука с Windows 10, но для этого необходимо выполнить следующие три шага:

  1. Выполните нажатие тремя пальцами.
  2. Переместите указатель мыши туда, куда хотите. При перетаскивании окна окно должно (и делает) следовать за курсором при его перемещении. При выборе текста вы должны увидеть, что текст выделяется, как и следовало ожидать, и даже прокрутка двумя пальцами должна работать (и работает)!
  3. Выполните нажатие одним пальцем, чтобы завершить имитируемый жест.

Проблема

Я абсолютно ошеломлен тем, что AHK способен на все это, поэтому неудивительно, что он работает не так хорошо, как я надеялся. Через неопределенное время я больше не могу нормально нажимать / касаться сенсорной панелью.

Мои вопросы

  1. Что на самом ^#F22 деле делает? Документы и мои ограниченные знания AHK, похоже, подразумевают, что он будет настроен Shift Ctrl Win Whatever F22 means как горячая клавиша, которая включает шаг 1. выше. Но включает ли он также шаг 2? Если нет…
  2. Как AHK может отслеживать указатель мыши, сохраняя действие перетаскивания, в то время как возможны любые удаления пальцев с сенсорной панели и повторные контакты с ней? Какие функции Win32 API вызываются с помощью каких строк скрипта?
  3. Как я могу исправить проблему с нажатием на сенсорную панель (у меня такое ощущение, что ответ «вы не можете», но, пожалуйста, докажите, что я ошибаюсь)?

Я уже потратил на это около 2 часов, читая документы и пытаясь заново освоиться с AHK в целом, потому что с тех пор, как я в последний раз использовал его (и даже тогда я никогда не делал ничего и вполовину такого продвинутого, как это)!

Ответ №1:

^#F22 делает то, что вы сказали, он регистрирует горячую клавишу для Shift Ctrl Win F22 (да, существуют клавиши F 13-24).
Таким образом, при установке нажатие тремя пальцами должно отправить эту комбинацию клавиш в Windows.
Вы можете попробовать это, например, с SendInput, ^#{F22}
Это должно открыть поиск Windows / Cortana.

На моем ноутбуке нажатие тремя пальцами отправило простой Win s в Windows.
Но я предполагаю, что при вашей установке все по-другому (по какой-либо причине).
Вы можете узнать, что именно отправляется, используя, например, Keyhistory (docs).


Так или иначе, как работает скрипт? На самом деле это действительно очень просто и четко сделано новичком AHK.
Когда перехватывается нажатие тремя пальцами (с помощью ^#F22 горячей клавиши), сценарии проверяют, принимает ли определяемый пользователем переключатель drag_enabled значение true или false.

  • Если false, перетаскивание не выполняется. Итак, он начинает перетаскивание, отправляя событие LButton down.
  • Если true, выполняется перетаскивание. Таким образом, он завершает перетаскивание, отправляя событие LButton up.

Горячая LButton клавиша есть, поэтому перетаскивание также можно завершить, нажав LButton.
Однако горячая клавиша на самом деле плохо реализована и нарушает встроенную функциональность LButton. Я исправлю это ниже.


Как AHK может отслеживать указатель мыши, сохраняя действие перетаскивания, в то время как возможны любые удаления пальцев с сенсорной панели и повторные контакты с ней?

AHK не заботится ни о чем из этого. Все это обрабатывается Windows. Выполнение каких-либо движений мыши (кроме щелчка) не имеет значения для действия перетаскивания. Только нажатие отменит удержание LButton.


Как я могу исправить проблему с нажатием на сенсорную панель (у меня такое ощущение, что ответ «вы не можете», но, пожалуйста, докажите, что я ошибаюсь)?

Я действительно не знаю, что вы имеете в виду, но я мог догадаться / надеяться, что это просто вызвано плохо реализованной LButton горячей клавишей. Я думаю, попробуйте и посмотрите, исправляет ли моя улучшенная версия ниже.


Итак, улучшенная версия:

  ^#F22::
    if (drag_enabled) 
        Click, Up
    else
        Click, Down
    drag_enabled := !drag_enabled
return

#If, drag_enabled
LButton::
    Click, Up
    drag_enabled := false
return
#If
 

Изменения в основном просто уплотняют / удаляют бесполезный код и правильно реализуют LButton горячую клавишу, чтобы не нарушать встроенную функциональность LButton, когда перетаскивание не выполняется.
Кажется, на моем ноутбуке все работает нормально, за исключением замены ^#F22 на #s .

Комментарии:

1. На моем ноутбуке простое нажатие тремя пальцами отправило простое Win S сообщение в Windows — вы правы, это действие по умолчанию, зарегистрированное в Win 10, и работало для меня до того, как я что-либо из этого установил. Я сам понял большую часть того, что вы сказали, просто прочитав сценарий, но в основном был просто сбит с толку тем, как ^#F22 это работает. Мех, по какой-то причине это происходит, так что спасибо за ваш ответ. Я тщательно протестирую ваш улучшенный скрипт и проверю, работает ли он 😉

2. Действительно, кажется, что проблема с первоначальным сценарием заключалась LButton в определении горячих клавиш внизу. Большое спасибо за вашу помощь! : D Я все еще не понимаю, почему работает другая странная комбинация клавиш, и почему <kbd>Win</kbd> <kbd>S</kbd> не работает у меня ни в одном AHK-скрипте — Windows настаивает на резервировании этой горячей клавиши для поиска Windows, возможно, потому, что у меня отключена Cortana…? Но в любом случае проблема решена: D