1

Тема: AHK: Буфер обмена - движением мыши.

Нужна помощь, по созданию скрипта для Буфера Обмена.

Суть скрипта:
Нажатие левой кнопки мыши, если задержка более N_секунд - включение скрипта:

Выделяя текст - отпуская левую кнопку мыши - ожидание дальнейших координат мыши

Если вверх двинул мышью - копирование
Вниз - вырезание
Влево - вставка
Вправо - удаление

Вот нашел пару скриптов из тем


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

А вот похожий скрипт, но он выводит после копирование - сообщение 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 (изменено: brwinded, 2013-06-18 22:17:11)

Re: AHK: Буфер обмена - движением мыши.

Вот чтот такое собрал, подскажите что не так тут?!


LButton::
  Quit=0                 ; Добавлена для взаимодействия.
  Click down             ; Имитация нажатия левой кнопки.
  MouseGetPos, x1, y1    ; Взять начальные координаты мыши.
  KeyWait, MButton       ; Ждать отпускания средней кнопки.
  if Quit
    Exit
  Click up               ; Имитация отпускания левой кнопки.
  if (MouseMove, 0, 10, 50, R)
      Send, ^{vk43}        ; Ctrl-C, копирование.
  if else (MouseMove, 0, -10, 50, R)
      Send, ^{vk56}        ; Ctrl-V, вставка.
  if else (MouseMove, -10, 0, 50, R)
      Send, ^{vk58}        ; Ctrl-X, вырезать.
 Exit

Он не выделяет вообще:)

3

Re: AHK: Буфер обмена - движением мыши.

Вот чтот такое собрал, подскажите что не так тут?!

Ну это примерно как коленвал к выхлопной трубе машины пристроить  -  "чтот такое собрал",  но почему-то не едет

Delay := 1000 ; 1 секунда
~LButton::
   Pressed := 1, Start := 0
   MouseGetPos, X0, Y0
   Sleep % Delay
   If !Pressed
      Exit
   MouseGetPos, X1, Y1
   if (Abs(X1-X0) < 15) && (Abs(Y1-Y0) < 15)
   Start := 1
Return

~LButton up::
   Pressed := 0
   if !Start
   Exit
   MouseGetPos, X0, Y0
   while Start && !Pressed {
      MouseGetPos, X1, Y1
      dx := X1-X0
      dy := Y1-Y0
      if ( Abs(dx) > 30) || (Abs(dy) > 30) {
         if Abs(dx) > Abs(dy)
            SendInput % dx > 0 ? "{vk2E}" : "^{vk56}"
         else
            SendInput % dy > 0 ? "^{vk58}" : "^{vk43}"
         Break
      }
      Sleep 50
   }
Return

4 (изменено: brwinded, 2013-06-19 00:03:04)

Re: AHK: Буфер обмена - движением мыши.

Оу:) Спасибо что откликнулся:)

Чтот не совсем понял как работает:) Там погрешность может добавить?

И добавить ожидание выделения ?:)

5 (изменено: Irbis, 2013-06-19 00:15:13)

Re: AHK: Буфер обмена - движением мыши.

Работает, как записано в первом посте.
Задержка зажатой ЛКМ 1 секунду на месте (+/- 15 пикселей) для включения скрипта. Если для старта привязка к месту не нужна, строки 8-9 нужно убрать.

6 (изменено: brwinded, 2013-06-19 00:19:08)

Re: AHK: Буфер обмена - движением мыши.

Так я ведь хотел чтоб это меню было возможно - после отпускания мышки.

Т.е. выделил, отпустил, повел вверх - скопировал, вниз - вставил


Еще вопросик, маленький:)

Пилю вот такой скрипт:

~LButton::

If (A_PriorHotKey = A_ThisHotKey and A_TimeSincePriorHotkey < 500)

{

  Sleep 300 ; wait for right-click menu, fine tune for your PC

  Send {Esc} ; close it

  Send ^v ; or your double-right-click action here

}
 Return

  If ( НЕ Понятно тут, Нужно условие ЕСЛИ Задержка мышки больше > 100)

    Send ^{vk43}

Return

7

Re: AHK: Буфер обмена - движением мыши.

  KeyWait, LButton, U, T1

  if errorlevel = 1
{
    Send ^c

}
 else
Return

Может так ожидание сделать ?

Хочу чтоб выделил мышкой, подержал 5 секунд - скопировал, если меньше - не скопировал.

8

Re: AHK: Буфер обмена - движением мыши.

Вот такой скрипт сделал себе, вроде не плохо:)



~LButton::
 
 KeyWait, LButton, U, T2
    if (ErrorLevel) {
        Send, ^{vk43} 
     ToolTip, Copy
     SetTimer, RemoveToolTip, 500
        KeyWait LButton
     
    }


 If (A_PriorHotKey = A_ThisHotKey and A_TimeSincePriorHotkey < 500)

{

  Sleep 300 ; wait for right-click menu, fine tune for your PC

  Send {Esc} ; close it

  Send, ^{vk56}  ; or your double-right-click action here
  ToolTip, Paste
  SetTimer, RemoveToolTip, 500

}
 Return

    

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
Return

9 (изменено: serzh82saratov, 2013-06-19 13:00:31)

Re: AHK: Буфер обмена - движением мыши.

Я бы, что-то типа этого сделал:


OnMessage(0x200, "WM_MOUSEMOVE") 
Return

~LButton::
    KeyWait, LButton, T2
    If ErrorLevel
    {    
        SendInput {LButton UP}
        GoSub GuiShow 
    }    
    Return
    
~LButton up::
    If WinExist("ahk_id" hgui)
        Gui Destroy
    Return 
    
GuiShow:
    Gui Color, D3DAED
    Gui Font, s20
    Gui, Margin, 0, 0
    Gui +Hwndhgui -Caption +E0x08000000 +Lastfound +AlwaysOnTop
    Gui Add, Text, Center Border y50 w200 h50 gSendInput vPaste, Вставить
    Gui Add, Text, Center Border xp+200 yp-50 wp hp gSendInput vCopy, Копировать
    Gui Add, Text, Center Border xp+200 yp+50 wp hp gSendInput vDel, Удалить
    Gui Add, Text, Center Border xp-200 yp+50 wp hp gSendInput vCut, Вырезать
    WinSet, TransColor, D3DAED
    CoordMode, Mouse
    MouseGetPos, x, y
    Gui Show, % "NA x" x-300 "y" y-75
    Return
    
WM_MOUSEMOVE() {  
    If A_GuiControl
        GoSub SendInput
    Return
    
    SendInput:
        SendInput % A_GuiControl = "Paste" ? "^{vk56}"  ;  "V"
            : A_GuiControl = "Copy" ? "^{vk43}"  ;  "C"
            : A_GuiControl = "Cut" ? "^{vk58}"  ;  "X"
            : A_GuiControl = "Del" ? "{Del}" : ""
        GuiControl, +cRed, %A_GuiControl%
        GuiControl, +Redraw, %A_GuiControl%
        Sleep 350
        Gui Destroy
        Return
}

на скорую руку, и без "украшений".

+ 1 редакция

OnMessage(0x200, "WM_MOUSEMOVE") 
Return

~LButton::
    KeyWait, LButton, T2
    If ErrorLevel
    {    
        SendInput {LButton UP}
        GoSub GuiShow 
    }    
    Return
    
~LButton up::
    If WinExist("ahk_id" hgui)
        Gui Destroy
    Return 
    
GuiShow:
    Gui Color, D3DAED
    Gui Font, s20
    Gui, Margin, 0, 0
    Gui +Hwndhgui -Caption +E0x08000000 +Lastfound +AlwaysOnTop
    Gui Add, Text, Center Border y50 w200 h50 gВставить vВставить, Вставить
    Gui Add, Text, Center Border xp+200 yp-50 wp hp gКопировать vКопировать, Копировать
    Gui Add, Text, Center Border xp+200 yp+50 wp hp gУдалить vУдалить, Удалить
    Gui Add, Text, Center Border xp-200 yp+50 wp hp gВырезать vВырезать, Вырезать
    WinSet, TransColor, D3DAED
    MouseGetPos, x, y
    Gui Show, % "NA x" x-300 "y" y-75
    Return
    
WM_MOUSEMOVE() { 
    If IsLabel(A_GuiControl)
        GoSub % A_GuiControl
    Return
    
    Вставить:
        SendInput ^{vk56}  ;  "V"
        GoTo Destroy
    Копировать:
        SendInput ^{vk43}  ;  "C"
        GoTo Destroy
    Удалить:
        SendInput {Del}
        GoTo Destroy
    Вырезать:
        SendInput ^{vk58}  ;  "X"

    Destroy: 
        GuiControl, +cRed, %A_GuiControl%
        GuiControl, +Redraw, %A_GuiControl% 
        Sleep 350
        Gui Destroy
        Return
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: serzh82saratov, 2013-06-19 14:35:08)

Re: AHK: Буфер обмена - движением мыши.

С картинками:


OnMessage(0x200, "WM_MOUSEMOVE")   
Return

~LButton::
    KeyWait, LButton, T2
    If ErrorLevel
    {    
        SendInput {LButton UP}
        GoSub GuiShow 
    }    
    Return
    
~LButton up::
    If WinExist("ahk_id" hgui)
        Gui Destroy
    Return 
    
GuiShow:
    Gui Color, D3DAED
    Gui Font, s20
    Gui, Margin, 0, 0
    Gui +Hwndhgui -Caption +E0x08000000 +Lastfound +AlwaysOnTop
    Gui Add, Picture, Border y33 gSendInput Icon133 vPaste w32 h-1, Shell32.dll
    Gui Add, Picture, Border xp+33 yp-33 gSendInput Icon135 vCopy w32 h-1, Shell32.dll
    Gui Add, Picture, Border xp+33 yp+33 gSendInput Icon272 vDel w32 h-1, Shell32.dll
    Gui Add, Picture, Border xp-33 yp+33 gSendInput Icon260 vCut w32 h-1, Shell32.dll
    WinSet, TransColor, D3DAED
    CoordMode, Mouse
    MouseGetPos, x, y
    Gui Show, % "NA x" x-49 "y" y-49
    Return
    
WM_MOUSEMOVE() {  
    If A_GuiControl
        GoSub SendInput
    Return
    
    SendInput:
        SendInput % A_GuiControl = "Paste" ? "^{vk56}"  ;  "V"
            : A_GuiControl = "Copy" ? "^{vk43}"  ;  "C"
            : A_GuiControl = "Cut" ? "^{vk58}"  ;  "X"
            : A_GuiControl = "Del" ? "{Del}" : ""
        GuiControl, , %A_GuiControl%, *Icon145 Shell32.dll 
        Sleep 350
        Gui Destroy
        Return
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11 (изменено: Irbis, 2013-06-19 18:52:04)

Re: AHK: Буфер обмена - движением мыши.

serzh82saratov, при выделении большого текста, выскакивает Gui, даже если курсор еще в движении. Также он появляется, если просто передвигать окно или делать Drag`n`Drop файла.

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

~LButton & RButton::
    KeyWait, LButton
       GoSub GuiShow 
    Return 

12

Re: AHK: Буфер обмена - движением мыши.

Irbis
Я предложил просто вариант алгоритма на скорую руку.
Делать готовое решение по данному вопросу я несобирался.
Любую идею можно допиливать до бесконечности. Занимайтесь...
Не нравится идея, не комментируйте, предложите свою.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Буфер обмена - движением мыши.

Спасибо Большое! Отличный совет! Спасибо! Буду доделывать:)

14

Re: AHK: Буфер обмена - движением мыши.

Логичней сделать как-нибудь так:


~WheelDown::
~WheelUp::
n = 1
return

~LButton::
loop
{
   n = 0
   MouseGetPos, x1, y1
   KeyWait, LButton, T1
   MouseGetPos, x2, y2
   If ((ErrorLevel) && (x1 = x2) && (y1 = y2) && (n = 0))
      break
   sleep, 100
}
SendInput {LButton UP}
GoSub GuiShow 
Return