1

Тема: AHK: как назначить для LButton & RButton среднюю кнопку мыши

Помогите, пожалуйста - я мало понимаю в программировании AHK, решаю чисто практическую проблему. Купил трекбол, у него нет средней кнопки. Хотел назначить, чтобы одновременное нажатие левой и правой эмулировало среднюю.

1) Как это сделать?
2) Почему простой код


~ LButton & RButton :: MButton ;

или

 
~ LButton & RButton :: Send, MouseClick,Middle ; 

работать не желает, говорит Invalid hotkey?

2

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

Синтаксис неверный, в справке есть примеры.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

С верным синтаксисом оно все равно не работает:

~LButton & RButton::Send, MouseClick,Middle ;

запускается, но эффекта никакого

4

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

abax пишет:

Помогите, пожалуйста - я мало понимаю в программировании AHK, решаю чисто практическую проблему. Купил трекбол, у него нет средней кнопки. Хотел назначить, чтобы одновременное нажатие левой и правой эмулировало среднюю.

Вот этот скрипт работает так как вы хотели?

LButton::
If GetKeyState("RButton", "P") {
    Send, {MButton}
    return
}
If GetKeyState(A_ThisHotkey, "P") {
    SendInput, % "{" A_ThisHotkey " Down}"
    Loop {
    if !GetKeyState(A_ThisHotkey, "P")
        break
    }
SendInput, % "{" A_ThisHotkey " Up}"
}
return


RButton::
If GetKeyState("LButton", "P") {
    Send, {MButton}
    return
}
If GetKeyState(A_ThisHotkey, "P") {
    SendInput, % "{" A_ThisHotkey " Down}"
    Loop {
    if !GetKeyState(A_ThisHotkey, "P")
        break
    }
SendInput, % "{" A_ThisHotkey " Up}"
}
return


ESC::
    ExitApp
AutoHotKey Version: 1.1.09.02
Не спеши, а то успеешь..

5

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

abax пишет:

С верным синтаксисом оно все равно не работает

Уже лучше, но где ты нашёл такой синтаксис:

~LButton & RButton::Send, MouseClick,Middle ;

MouseClick — это отдельная команда, в качестве параметра Send она не катит.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

Вот этот скрипт работает так как вы хотели?

Большое спасибо, почти, но не совсем. В Файрфоксе он дает эффект нажатой средней кнопки мыши, ПОКА ОБЕ КНОПКИ НЕ ОТПУЩЕНЫ. Что, увы, делает его малополезным.

Кроме того, он делает неработоспособным другой скрипт для трекбола, который я вытащил в другом месте - эмулирующий прокрутку колесиком:


;;
;; Emulate_Scrolling_Middle_Button.ahk
;; Author: Erik Elmore <erik@ironsavior.net>
;; Version: 1.1 (Aug 16, 2005)
;;
;; Enables you to use any key with cursor movement
;; to emulate a scrolling middle button.  While
;; the TriggerKey is held down, you may move the
;; mouse cursor up and down to send scroll wheel
;; events.  If the cursor does not move by the
;; time the TriggerKey is released, then a middle
;; button click is generated.  I wrote this for my
;; 4-button Logitech Marble Mouse (trackball), 
;; which has no middle button or scroll wheel.
;;

;; Configuration

;#NoTrayIcon

;; Higher numbers mean less sensitivity
esmb_Threshold = 3
;; Delay 10*10ms, then put pointer back to original location
esmb_delay = 10

;; This key/Button activates scrolling
esmb_TriggerKey = RButton

;; End of configuration

#Persistent
CoordMode, Mouse, Screen
Hotkey, %esmb_TriggerKey%, esmb_TriggerKeyDown
HotKey, %esmb_TriggerKey% Up, esmb_TriggerKeyUp
esmb_KeyDown = n
return

esmb_TriggerKeyDown:
esmb_Moved = n
esmb_FirstIteration = y
esmb_KeyDown = y
MouseGetPos,, esmb_OldY
MouseGetPos, esmb_OrigX, esmb_OrigY
esmb_counter := 0
SetTimer, esmb_CheckForScrollEventAndExecute, 10
;;LButton & RButton::MButton
return

esmb_TriggerKeyUp:
esmb_KeyDown = n
SetTimer, esmb_CheckForScrollEventAndExecute, Off
;; Send a middle-click if we did not scroll
if esmb_Moved = n
    MouseClick, Right
return

esmb_CheckForScrollEventAndExecute:
if esmb_KeyDown = n
    return

MouseGetPos,, esmb_NewY
esmb_Distance := esmb_NewY - esmb_OldY
if esmb_Distance
    esmb_Moved = y

;; Do not send clicks on the first iteration
if esmb_FirstIteration = y
    esmb_FirstIteration = n
else if esmb_Distance > %esmb_Threshold%
{
    esmb_OldY := esmb_OldY + esmb_Threshold
    MouseClick, WheelDown
}
else if esmb_Distance < -%esmb_Threshold%
{
    esmb_OldY := esmb_OldY - esmb_Threshold
    MouseClick, WheelUp
}
else
{
    esmb_counter := esmb_counter + 1
    if( esmb_counter > esmb_delay)
    {
        esmb_counter := 0
        MouseMove,esmb_OrigX,esmb_OrigY
        MouseGetPos,, esmb_OldY
    }
}
return 

В любом случае, признателен Вам за помощь.

7

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

abax пишет:

Кроме того, он делает неработоспособным другой скрипт для трекбола, который я вытащил в другом месте - эмулирующий прокрутку колесиком:



У меня нет трекбола что бы понять что делает выложеный скрипт..
1)Опишите что делает этот скрипт, и при каких обстоятельствах.


abax пишет:

Большое спасибо, почти, но не совсем. В Файрфоксе он дает эффект нажатой средней кнопки мыши, ПОКА ОБЕ КНОПКИ НЕ ОТПУЩЕНЫ. Что, увы, делает его малополезным.

Такой вариант актуален?:

Нажимаем: ПКМ + ЛКМ  = Срабатывать удержание СКМ ,
Повторно нажимаем ПКМ + ЛКМ   =  СКМ будет становиться отпущеной.
AutoHotKey Version: 1.1.09.02
Не спеши, а то успеешь..

8

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

migomigo пишет:

У меня нет трекбола что бы понять что делает выложеный скрипт..
1)Опишите что делает этот скрипт, и при каких обстоятельствах.

При одновременном нажатии ПКМ и вращении шарика (на обычной мышке - полагаю, движения мыши) прокрутка вверх-вниз.

migomigo пишет:

Такой вариант актуален?:

Нажимаем: ПКМ + ЛКМ  = Срабатывать удержание СКМ ,
Повторно нажимаем ПКМ + ЛКМ   =  СКМ будет становиться отпущеной.

Да.

9

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

Попробуйте запустить этот скрипт.
Отдельно.
Функционал:
1) Нажимаем: ЛКМ + ПКМ  = Срабатывать удержание СКМ ,
     Повторно нажимаем ЛКМ + ПКМ   =  СКМ будет становиться отпущеной.
2) При одновременном нажатии ПКМ и вращении шарика (Или движение мишки Вверх / Низ) =  прокрутка вверх-вниз.


SendMode, Input
SetKeyDelay, -1
SetMouseDelay, -1
Sens := "3"           ;================ [ Чувствительность прокрутки ] ====================
T_Sens := "3"        ;==================== [ Интервал прокрутки ] ========================


RButton::
MemPos_Y := MGP_Y()
If GetKeyState("LButton", "P") {
    OnOff := !OnOff
    If (!OnOff) {
        Send, {MButton Up}
        return
    }
    Send, {MButton Down}
    return
}
Loop
{
    If (MemPos_Y <> MGP_Y()) {
        Wheel_Funk1(A_ThisHotkey, Sens, T_Sens)
        return
    }
    If !(GetKeyState("RButton", "P")) {
        break
    }
    Sleep, 25
}
UpDwKeyFunk(A_ThisHotkey)
return


Wheel_Funk1(Hot_key_, Sens, T_Sens)
{
    Loop
    {
        MemPos_Y := MGP_Y()
        Sleep, % T_Sens
        If ((MemPos_Y - Sens) > MGP_Y())
        {
            MouseClick, WheelUp
            Sleep, % T_Sens
        }
        If ((MemPos_Y + Sens) < MGP_Y())
        {
            MouseClick, WheelDown
            Sleep, % T_Sens
        }
        Sleep, % T_Sens
        If !GetKeyState(Hot_key_, "P") {
            return
        }
    }
}
UpDwKeyFunk(Hot_key)
{
    SendInput, % "{" Hot_key " Down}"
    while GetKeyState(Hot_key, "P")
        Sleep, 25
    SendInput, % "{" Hot_key " Up}"
}
MGP_Y()
{
    MouseGetPos,, Var_Y
    return, Var_Y
}

ESC::
    ExitApp
AutoHotKey Version: 1.1.09.02
Не спеши, а то успеешь..

10

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

migomigo пишет:

Попробуйте запустить этот скрипт.

Выдает предупреждение при запуске и при первом срабатывании:
http://savl.spb.ru/screens/2013-01-29_1720.png
http://savl.spb.ru/screens/2013-01-29_1723.png

Но, в принципе, работает.

11

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

Так сказано же запустить этот скрипт, а не вставить код в файл шаблона ahk скрипта.
Уберите директиву #Warn из первой строки.

12

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

Да, я в курсе, что предупреждения можно отключать.
Уважаемому migomigo большое спасибо - скрипт очень удобный.

13

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

Немного дополнил скрипт:

SendMode, Input
SetKeyDelay, -1
SetMouseDelay, -1
Sens := "3"           ;================ [ Чувствительность прокрутки ] ====================
T_Sens := "3"        ;==================== [ Интервал прокрутки ] ========================
MB_U := "{MButton Up}", MB_D := "{MButton Down}", WA := "WheelUp", WD := "WheelDown"


RButton::
If GetKeyState("LButton", "P") {
    Send, % (OnF := !OnF) ? (MB_D) : (MB_U)
    return
}
MemPos_Y := MGP_Y(), MemPos_X := MGP_X()
Loop
{    
    Slp("25")
    If (MemPos_Y <> MGP_Y()) || (MemPos_X <> MGP_X()) {
        Wheel_Funk1(A_ThisHotkey, Sens, T_Sens, WA, WD)
        return
    }
    If !(GetKeyState("RButton", "P")) {
        break
    }
    Slp("25")
}
UpDwKeyFunk(A_ThisHotkey)
return


Wheel_Funk1(Hot_key_, Sens, T_Sens, WA, WD)
{
    Loop
    {
        MemPos_Y := MGP_Y(), MemPos_X := MGP_X()
        Slp(T_Sens)
        ((MemPos_Y - Sens) > MGP_Y()) ? MC(WA), ((MemPos_Y + Sens) < MGP_Y()) ? MC(WD)
        ((MemPos_X - Sens) > MGP_X()) ? MC_WL(), ((MemPos_X + Sens) < MGP_X()) ? MC_WR()
        Slp(T_Sens)
        If !GetKeyState(Hot_key_, "P") {
            return
        }
    }
}
UpDwKeyFunk(Hot_key)
{
    SendInput, % "{" Hot_key " Down}"
    while GetKeyState(Hot_key, "P")
        Slp("25")
    SendInput, % "{" Hot_key " Up}"
}
MGP_Y()
{
    MouseGetPos,, Var_Y
    return, Var_Y
}
MGP_X()
{
    MouseGetPos, Var_X
    return, Var_X
}
Slp(T_Sens)
{
    Sleep, T_Sens
}
MC(Key)
{
    MouseClick, % Key
    return
}
MC_WL()
{
    ControlGetFocus, fcontrol, A
    SendMessage, 0x114, 0, 0, % fcontrol, A
}

MC_WR()
{
    ControlGetFocus, fcontrol, A
    SendMessage, 0x114, 1, 0, % fcontrol, A
}

ESC::
    ExitApp

Функционал:
1) Нажимаем: ЛКМ + ПКМ  = Срабатывать удержание СКМ ,
     Повторно нажимаем ЛКМ + ПКМ   =  СКМ будет становиться отпущеной.
2) При одновременном нажатии ПКМ и вращении шарика (Или движение мишки Вверх / Низ) =  прокрутка вверх-вниз.
Добавлено:
3) При одновременном нажатии ПКМ и вращении шарика (Или движение мишки Вправо / Влево) =  прокрутка Вправо-Влево.

AutoHotKey Version: 1.1.09.02
Не спеши, а то успеешь..

14

Re: AHK: как назначить для LButton & RButton среднюю кнопку мыши

Добрый день, подскажите, пожалуйста, как модифицировать код из 4 сообщения так, чтобы при одновременном клике на ПКМ + ЛКМ происходило зажатие Средней кнопки  {MButton Down}.  И она оставалась зажатой до тех пор, пока не будет произведен клин ПКМ?