1

Тема: AHK: Копирование при зажатой левой клавише мыши

Идея скрипта - копировать текст при выделении, если на некоторое время остается зажатой левая клавиша мыши. Написал тестовый вариант.

Подробное описание - при двойном клике и последующем зажатии копирует текст в буфер обмена и под мышкой вылезает тултип "copy", изчезающий как только ЛКМ отпускается. При одиночном зажатии клавиши и выделении текста копирует его в буфер, причем проверяет, отпущена ли клавиша и если нет, то следит, двигается ли мышь и если двигается, продолжает копировать текст до отпускания ЛКМ. Т.е. если выделить часть текста, затем не отпуская клавишу еще выделить, то он скопирует именно выделенную часть текста.

Недостатки - скрипт работает в холостую - если просто где-нибудь зажать клавишу, он работает. Было бы здорово, если бы он определял текст и работал только с ним.

~LButton::

x1 =
y1 =

loop
    {
    MouseGetPos, x2, y2
    Sleep, 200
    if (x1 = %x2% and y1 = %y2%)
        Break
    x1 = %x2%
    y1 = %y2%
    }

KeyWait, Lbutton, U T.5
if errorlevel = 1
    {
    Label1:
    ControlGetFocus, control, A
    SendMessage, 0x301, , , %control%, A
    ToolTip, Copy
    KeyWait, Lbutton, U T.5
    if errorlevel = 1
        {
        x3 =
        y3 =

        loop
            {
            MouseGetPos, x4, y4
            Sleep, 200
            if (y3 = %y4% and x3 = %x4%)
                Break
            x3 = %x4%
            y3 = %y4%
            }
        Goto, Label1
        }
    Else
        {
        ToolTip
        Exit
        }
    }
Exit

Return

2

Re: AHK: Копирование при зажатой левой клавише мыши

Kamagi, заголовку темы не хватало префикса. Я добавил.

3 (изменено: Irbis, 2012-03-29 12:01:58)

Re: AHK: Копирование при зажатой левой клавише мыши

Довольно просто выделить текст ЛКМ, и, не отпуская ее, нажать среднюю кнопку мыши.
Никаких "холостых"циклов; плюс еще в том, что никакой случайный текст не сотрет содержимое буфера обмена, если нет такой цели.

MButton::
  if GetKeyState("LButton", "P")
    Send ^{vk43}
  else
    Click M
return

4

Re: AHK: Копирование при зажатой левой клавише мыши

Можно всё на среднюю кнопку повесить: AutoHotkey: Копирование/вырезание/вставка текста средней кнопкой мыши.

Irbis пишет:

Довольно просто выделить текст ЛКМ, и, не отпуская ее, нажать среднюю кнопку мыши.

Мне, кстати, это сложно проделать. То ли мышь маленькая, то ли средний палец плохо гнётся.

5

Re: AHK: Копирование при зажатой левой клавише мыши

2 Irbis Для клавиш мыши, префикс $ не требуется.

6

Re: AHK: Копирование при зажатой левой клавише мыши

Grey, исправил.
YMP, возможно, и предложенный мной вариант имеет право на жизнь, с обычной A4 X7 это не представляет сложностей.
Хотя твой вариант интересен, пожалуй, надо "допилить" его под себя с учетом твоих примечаний и добавить в свой скрипт, сидящий в автозагрузке.

7 (изменено: creature.ws, 2012-03-29 13:45:49)

Re: AHK: Копирование при зажатой левой клавише мыши

Наверно дело таки в привычке, а не размере мыши

(Тоже не получается комфортно нажимать mbutton средним пальцем даже на x7)
Вариант :

~LButton::
    If (A_Cursor <> "IBeam" || A_ThisHotkey == A_PriorHotkey && A_TimeSincePriorHotkey < 90)
        return
    MouseGetPos, x0, y0, class0, classNN0
    KeyWait, LButton
    If (A_TimeSinceThisHotkey < 200 || A_Cursor <> "IBeam")
        return
    MouseGetPos, x1, y1, class1, classNN1
    If (class1 <> class0 || classNN1 <> classNN0 || abs(x0-x1) < 4 && abs(y0-y1) < 4)
        return
    SendInput ^{Insert}
    SoundPlay *64
    return

8 (изменено: Irbis, 2012-03-29 18:20:29)

Re: AHK: Копирование при зажатой левой клавише мыши

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

~LButton::
    If (A_Cursor <> "IBeam" || A_ThisHotkey == A_PriorHotkey && A_TimeSincePriorHotkey < 90)
       return
    MouseGetPos, x0, y0, class0, classNN0
    KeyWait, LButton
    If (A_TimeSinceThisHotkey < 100 || A_Cursor <> "IBeam")
       return
    MouseGetPos, x1, y1, class1, classNN1
    If (class1 <> class0 || classNN1 <> classNN0 || abs(x0-x1) < 4 && abs(y0-y1) < 4)
       return
^Ins::
^vk43::
   a := Clipboard
   SendInput ^{Ins}
return

+Ins::
^vk56::
   b := Clipboard
   Clipboard =
   SendInput ^{Ins}
   Clipboard := Clipboard==b ? a : b
   SendInput +{Ins}
return

9 (изменено: creature.ws, 2012-03-29 18:49:41)

Re: AHK: Копирование при зажатой левой клавише мыши

Не фейл, а «несоответствие ожиданиям». Вариант из сообщения #7 копирует при выделении.

10

Re: AHK: Копирование при зажатой левой клавише мыши

alexii,
ооо, извиняюсь, был невнимателен, спасибо за

На средней клавише у меня висит закрытие окон/вкладок, так что мне больше по душе вариант с зажатой ЛКМ. Хорошая мысль - ориентироваться на форму курсора. Я за минимизацию клавиатурных хоткеев в повседневном использовании, поскольку левой рукой либо ем, либо пью, либо подпираю голову

Вот мой обновленный код, но мне нужна помощь с синтаксисом - в условии IF в LOOP я хочу, чтобы он проверял и по X, и по Y, но как это правильно написать не знаю, ввожу второе условие и скрипт не работает.

~LButton::

If (A_Cursor <> "IBeam")
    return

KeyWait, Lbutton, U T.5
if errorlevel = 1
    {
    Label1:
    ControlGetFocus, control, A
    SendMessage, 0x301, , , %control% , A
    ToolTip, Copy
    KeyWait, Lbutton, U T.5
        if errorlevel = 1
        {
        x3 = 
        y3 = 

        loop
            {
            MouseGetPos, x4, y4
            if y3 = y4 ; ??? - как вписать сюда второе условие по Х?
                Break
            x3 = x4
            y3 = y4
            Sleep, 600
            }
        Goto, Label1
        }
    }
ToolTip
Return

11

Re: AHK: Копирование при зажатой левой клавише мыши

creature.ws, да, пожалуй такая формулировка верней.
Kamagi, у creature.ws в  посте #7 всё присутствует в полном объеме:

If (abs(x0-x1) < 4 && abs(y0-y1) < 4)

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