Тема: AutoHotkey: Копирование/вырезание/вставка текста средней кнопкой мыши
Исходная идея взята здесь: Cut and paste with the mouse. , но реализована иначе.
Сначала более простой пример. Удерживая среднюю кнопку мыши, выделяем кусок текста, и он автоматически копируется в буфер обмена. Щелчок средней кнопкой вставляет фрагмент из буфера в точку, где находится курсор мыши.
MButton::
Click down ; Имитация нажатия левой кнопки.
MouseGetPos, x1, y1 ; Взять начальные координаты мыши.
KeyWait, MButton ; Ждать отпускания средней кнопки.
Click up ; Имитация отпускания левой кнопки.
MouseGetPos, x2, y2 ; Конечные координаты мыши.
dx:=Abs(x1-x2) ; Смещения по осям X и Y.
dy:=Abs(y1-y2)
if (dx>1.5 || dy>10) ; Чтобы отличить щелчок от выделения.
Send, ^{vk43} ; Ctrl-C, копирование.
else
Send, ^{vk56} ; Ctrl-V, вставка.
Exit
Есть, как водится, и недостатки: не получится вставить средней кнопкой фрагмент текста из буфера вместо какого-то выделенного фрагмента. При щелчке выделение будет сброшено и вставка произойдёт в точку, где окажется текстовый курсор.
В следующем примере эта проблема решена - за счёт использования колеса. Теперь, если после выделения текста отпускаем кнопку, фрагмент по-прежнему копируется в буфер. Но если, не отпуская кнопки, повернуть колесо вверх (от себя), текст из буфера будет вставлен вместо выделенного фрагмента. Если колесо повернуть вниз, выделенный фрагмент вырезается в буфер. Как и раньше, работает вставка щелчком средней кнопки.
MButton::
Quit=0 ; Добавлена для взаимодействия.
Click down ; Имитация нажатия левой кнопки.
MouseGetPos, x1, y1 ; Взять начальные координаты мыши.
KeyWait, MButton ; Ждать отпускания средней кнопки.
if Quit
Exit
Click up ; Имитация отпускания левой кнопки.
MouseGetPos, x2, y2 ; Конечные координаты мыши.
dx:=Abs(x1-x2) ; Смещения по осям X и Y.
dy:=Abs(y1-y2)
if (dx>1.5 || dy>10) ; Чтобы отличить щелчок от выделения.
Send, ^{vk43} ; Ctrl-C, копирование.
else
Send, ^{vk56} ; Ctrl-V, вставка.
Exit
WheelUp::
if GetKeyState("MButton", "P") ; Нажата ли средняя кнопка.
{
Click up ; Имитация отпускания левой кнопки в конце выделения.
Send, ^{vk56} ; Ctrl-V, вставить.
Quit=1 ; Сигнал завершения работы.
}
else Send, {WheelUp} ; Если кнопка не нажата, колесо работает как обычно.
Exit
WheelDown::
if GetKeyState("MButton", "P")
{
Click up
Send, ^{vk58} ; Ctrl-X, вырезать.
Quit=1
}
else Send, {WheelDown}
Exit
Опять есть оборотная сторона: колесо вращается легко, а кнопка нажимается с усилием. Так что возможны ошибки из-за лишних движений - вставка вместо копирования и т.п. При вставке щелчком курсор надо держать неподвижно. В общем, желательна точность движений.
Чувствительность по оси X можно, впрочем, уменьшить, увеличив порог для dx. Я сделал его 1,5 пиксела, чтобы можно было копировать/вырезать отдельные буквы, знаки препинания. Возможно, это и ни к чему.
Если, нажав кнопку для вставки, видите, что курсор оказался не совсем там, где надо, поверните колесо вниз, тогда ничего не вставится и фрагмент в буфере не потеряется.