1

Тема: 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 пиксела, чтобы можно было копировать/вырезать отдельные буквы, знаки препинания. Возможно, это и ни к чему.
Если, нажав кнопку для вставки, видите, что курсор оказался не совсем там, где надо, поверните колесо вниз, тогда ничего не вставится и фрагмент в буфере не потеряется.