1

Тема: Помощь для скрипта на события мыши

Здравствуйте, уважаемые скриптописатели.
Прошу помощи в написании скрипта для мыши или в направлении куда копать. Из-за своей парализации, могу использовать только мышь и хотелось бы вспомнить старое и поиграть в ретро с приставок. С моими двух дневными знаниями АХК, меня хватило только на это:

sensitivity=20 ; настройка чувствительности
MouseGetPos,x1,y1 ; хватаем позицию курсора мыши
Sleep,180


Loop
{
  MouseGetPos,x2,y2 ; взять текущую позицию курсора
  ; назначаем разные действия по разнице начальных и конечных координат:

  If (x1-x2 > sensitivity and y1-y2 > sensitivity) ; вверх-влево
    {
      Send {Up down}{Left down}
      Send {Up up}{Left up}
      Gosub,ShowToolTip
      ;Goto,RemoveToolTip ; раскомментирование этой строки делает действие ОДНОКРАТНЫМ, иначе повторяетcя пока клавиша нажата
    }
  If (x1-x2 < -sensitivity and y1-y2 > sensitivity) ; вверх-вправо
    {
      Send {Up down}{Right down}
      Send {Up up}{Right up}
      Gosub,ShowToolTip
      ;Goto,RemoveToolTip
    }
  If (x1-x2 > sensitivity and y1-y2 < -sensitivity) ; вниз-влево
    {
      Send {Down down}{Left down}
      Sleep, 200
      Send {Down up}{Left up}
      Gosub,ShowToolTip
      ;Goto,RemoveToolTip
    }
  If (x1-x2 < -sensitivity and y1-y2 < -sensitivity) ; вниз-вправо
    {
      Send {Down down}{Right down}
      Sleep, 200
      Send {Down up}{Right up}
      Gosub,ShowToolTip
      ;Goto,RemoveToolTip
    }
  If (x1-x2 < sensitivity and y1-y2 > sensitivity) ; вверх
    {
      Send {Up down}
      Sleep, 200
      Send {Up up}
      Gosub,ShowToolTip
      ;Goto,RemoveToolTip
    }
  If (x1-x2 < sensitivity and y1-y2 < -sensitivity) ; вниз
    {
      Send {Down down}
      Sleep, 200
      Send {Down up}
      Gosub,ShowToolTip
      ;Goto,RemoveToolTip
    }
  If (x1-x2 > sensitivity and y1-y2 < sensitivity) ; влево
    {
      Send {Left down}
      Sleep, 200
      Send {Left up}
      Gosub,ShowToolTip
      ;Goto,RemoveToolTip
    }
  If (x1-x2 < -sensitivity and y1-y2 < sensitivity) ; вправо
    {
      Send {Right down}
      Sleep, 200
      Send {Right up}
      Gosub,ShowToolTip
      ;Goto,RemoveToolTip
    }
  
}

ShowToolTip: ; "ПОКАЗУХА"
; присваиваем конечные координаты начальным переменным
; для отслеживания изменения относительно нового положения курсора
  x1:=x2
  y1:=y2
  ToolTip %ShowAction% ; отображать ToolTip`ом название нажатой кнопке

RemoveToolTip:
  Sleep,100 ; задержка на отображение ToolTip
  ToolTip ; по истечении задержки убираем ToolTip
Return ; полный конец

Код был взят с ранних примеров.

Что хотелось бы видеть:
1. При нажатии определённой клавиши, происходила фиксация курсора в центре экрана и от этой точки бы шли вычисления т.к. в коде выше курсор часто упирается в края.Ну и нужна соответственно, диактивация фиксации на другую кнопку.
2. Исчезновение курсора во время фиксации.
3. Плавность выполнения команд. Ибо с тем кодом всё происходит рывками...

2

Re: Помощь для скрипта на события мыши

Могу предложить такой наглядный вариант:


#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1
OnExit, Exit
OnMessage(0x200, "WM_MOUSEMOVE")
VarSetCapacity(RECT, 16 ,0)
side := 50

Gui, -DPIScale +AlwaysOnTop -Caption +HWNDhThisGui +E0x08000000
Gui, Margin, 0, 0
Loop 9
    Gui, Add, Progress, % (Mod(A_Index+2, 3) ? "x+0" : "x0")
        . " y" ((A_Index-1)//3)*(side ) " h" side " w" side " cD9952F v" A_Index, 100
Return

1::
    Gui, Show, NA
    WinSet, Transparent, 150, ahk_id %hThisGui%
    DllCall("GetWindowRect","uint",hThisGui,"uint",&RECT)
    DllCall("ClipCursor","uint",&RECT)
    SetTimer, IsThisGui, 100
    Return

2::
Close: 
    Gui, Hide 
    SetTimer, IsThisGui, Off
    GuiControl, +cD9952F, % prArea 
    DllCall("ClipCursor"), prArea := ""
    Return
    
Exit:
    DllCall("ClipCursor") 
    ExitApp

WM_MOUSEMOVE()   {
    Global prArea 
    Area := A_GuiControl
    If (Area = prArea)
        Return
    GuiControl, -Redraw, % prArea
    GuiControl, +cD9952F, % prArea
    GuiControl, +Redraw, % prArea 
    GuiControl, -Redraw, % Area
    GuiControl, +c696969, % Area
    GuiControl, +Redraw, % Area
    If (prArea != "" && prArea != 5)
        Send(prArea, "Up")
    prArea := Area
    If (Area != 5)
        Send(Area, "Down")
} 

Send(n, mode)   {
    Static Send := ["Up|Left", "Up", "Up|Right", "Left", "", "Right", "Left|Down", "Down", "Down|Right"]
    This := StrSplit(Send[n], "|")
    SendInput % "{" This[1] " " mode "}" (This[2] != "" ? "{" This[2] " " mode "}" : "") 
} 

IsThisGui:
    MouseGetPos, , , WinID
    If (hThisGui = WinID) 
        Return
    GoTo Close
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

3 (изменено: Xion, 2014-07-18 21:49:56)

Re: Помощь для скрипта на события мыши

Спасибо большое, пример стоящий! Вот только для меня, тут как то всё очень мудро, но зато будет чем заняться.

Можно ещё попросить кусочек кода, что бы курсор возвращался в центральное положение через секунду?

Я так понял тут событие вызывается при наведении на определённый квадрат, значит можно просто уменьшить их и должно получится, то что хотел.

4 (изменено: serzh82saratov, 2014-07-18 23:57:11)

Re: Помощь для скрипта на события мыши

Вот только для меня, тут как то всё очень мудро

В первой редакции у меня всегда недопилено лишнее.

Можно ещё попросить кусочек кода, что бы курсор возвращался в центральное положение через секунду?

Перемещение в центр непомешает (функция -MoveCenter()):


#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1
OnExit, Exit
OnMessage(0x200, "WM_MOUSEMOVE")
CoordMode Mouse
VarSetCapacity(RECT, 16 ,0)
side := 50

Gui, -DPIScale +AlwaysOnTop -Caption +HWNDhThisGui +E0x08000000
Gui, Margin, 0, 0
Loop 9
    Gui, Add, Progress, % (Mod(A_Index+2, 3) ? "x+0" : "x0")
        . " y" ((A_Index-1)//3)*(side ) " h" side " w" side " cD9952F v" A_Index, 100
Return

1::
    Gui, Show, NA
    WinSet, Transparent, 150, ahk_id %hThisGui%
    MoveCenter()
    GuiControl, +c696969, 5 
    DllCall("GetWindowRect","uint",hThisGui,"uint",&RECT)
    DllCall("ClipCursor","uint",&RECT)
    SetTimer, IsThisGui, 100
    Return

2::
Close: 
    Gui, Hide 
    SetTimer, IsThisGui, Off
    GuiControl, +cD9952F, % prArea 
    If (prArea != "" && prArea != 5)
        Send(prArea, "Up"), prArea := ""
    DllCall("ClipCursor")
    Return
    
Exit:
    DllCall("ClipCursor") 
    ExitApp

WM_MOUSEMOVE()   {
    Global prArea 
    Area := A_GuiControl
    If (Area = prArea)
        Return
    GuiControl, -Redraw, % prArea
    GuiControl, +cD9952F, % prArea
    GuiControl, +Redraw, % prArea 
    GuiControl, -Redraw, % Area
    GuiControl, +c696969, % Area
    GuiControl, +Redraw, % Area
    If (prArea != "" && prArea != 5)
        Send(prArea, "Up")
    prArea := Area
    If (Area != 5)
        Send(Area, "Down")
} 

Send(n, mode)   {
    Static Send := ["Up|Left", "Up", "Up|Right", "Left", "", "Right", "Left|Down", "Down", "Down|Right"]
    This := StrSplit(Send[n], "|")
    SendInput % "{" This[1] " " mode "}" (This[2] != "" ? "{" This[2] " " mode "}" : "") 
} 

IsThisGui:
    MouseGetPos, , , WinID
    If (hThisGui = WinID) 
        Return
    GoTo Close

MoveCenter()   {
    Global hThisGui 
    WinGetPos, WinX, WinY, WinWidth, WinHeight, ahk_id %hThisGui%
    MouseMove, WinX+WinWidth/2, WinY+WinHeight/2, 0 
} 

А вот через секунду после чего, я непонял (или кое кому, сложно уточнить).

+ может это

#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1
OnExit, Exit
OnMessage(0x200, "WM_MOUSEMOVE")
CoordMode Mouse
VarSetCapacity(RECT, 16 ,0)
side := 50

Gui, -DPIScale +AlwaysOnTop -Caption +HWNDhThisGui +E0x08000000
Gui, Margin, 0, 0
Loop 9
    Gui, Add, Progress, % (Mod(A_Index+2, 3) ? "x+0" : "x0")
        . " y" ((A_Index-1)//3)*(side ) " h" side " w" side " cD9952F v" A_Index, 100
Return

1::
    Gui, Show, NA
    WinSet, Transparent, 150, ahk_id %hThisGui%
    MoveCenter()
    GuiControl, +c696969, 5 
    DllCall("GetWindowRect","uint",hThisGui,"uint",&RECT)
    DllCall("ClipCursor","uint",&RECT)
    SetTimer, IsThisGui, 100
    Return

2::
Close: 
    Gui, Hide 
    SetTimer, IsThisGui, Off
    GuiControl, +cD9952F, % prArea 
    If (prArea != "" && prArea != 5)
        Send(prArea, "Up"), prArea := ""
    DllCall("ClipCursor")
    Return

IsThisGui:
    MouseGetPos, , , WinID
    If (hThisGui = WinID) 
        Return
    GoTo Close

MoveCenter:
    MoveCenter()
    Return
    
Exit:
    DllCall("ClipCursor") 
    ExitApp

WM_MOUSEMOVE()   {
    Global prArea 
    Area := A_GuiControl
    If (Area = prArea)
        Return
    GuiControl, -Redraw, % prArea
    GuiControl, +cD9952F, % prArea
    GuiControl, +Redraw, % prArea 
    GuiControl, -Redraw, % Area
    GuiControl, +c696969, % Area
    GuiControl, +Redraw, % Area
    If (prArea != "" && prArea != 5)
        Send(prArea, "Up")
    prArea := Area
    If (Area != 5)
        Send(Area, "Down") 
    SetTimer, MoveCenter, -1000    
} 

Send(n, mode)   {
    Static Send := ["Up|Left", "Up", "Up|Right", "Left", "", "Right", "Left|Down", "Down", "Down|Right"]
    This := StrSplit(Send[n], "|")
    SendInput % "{" This[1] " " mode "}" (This[2] != "" ? "{" This[2] " " mode "}" : "")   
} 
    
MoveCenter()   {
    Global hThisGui 
    WinGetPos, WinX, WinY, WinWidth, WinHeight, ahk_id %hThisGui%
    MouseMove, WinX+WinWidth/2, WinY+WinHeight/2, 0 
}  

Я так понял тут событие вызывается при наведении на определённый квадрат, значит можно просто уменьшить их и должно получится, то что хотел.

Это тоже непонял, но если...:

side := 50

то 50 это размер стороны квадратиков.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5

Re: Помощь для скрипта на события мыши

Огромное спасибо, прекрасно получилось, в моём понимании прекрасного, конечно.
Можно ещё попросить что бы при активации курсор пропадал? (а то мешает он прилично)

6 (изменено: serzh82saratov, 2014-07-19 08:23:02)

Re: Помощь для скрипта на события мыши

Мне кажется без курсора не удобно.


#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1
OnExit, Exit
OnMessage(0x200, "WM_MOUSEMOVE")
CoordMode Mouse
VarSetCapacity(RECT, 16 ,0)
side := 50

Gui, -DPIScale +AlwaysOnTop -Caption +HWNDhThisGui +E0x08000000
Gui, Margin, 0, 0
Loop 9
    Gui, Add, Progress, % (Mod(A_Index+2, 3) ? "x+0" : "x0")
        . " y" ((A_Index-1)//3)*(side) " h" side " w" side " cD9952F v" A_Index, 100
Return

1::
    Gui, Show, NA
    WinSet, Transparent, 150, ahk_id %hThisGui%
    MoveCenter()
    GuiControl, +c696969, 5 
    DllCall("GetWindowRect","uint",hThisGui,"uint",&RECT)
    DllCall("ClipCursor","uint",&RECT)
    SetTimer, IsThisGui, 100
    DllCall("ShowCursor", "uint", 0) 
    Return

2::
Close: 
    Gui, Hide 
    SetTimer, IsThisGui, Off
    GuiControl, +cD9952F, % prArea  
    If (prArea != "" && prArea != 5)
        Send(prArea, "Up"), prArea := 5
    DllCall("ClipCursor")
    Return

IsThisGui:
    MouseGetPos, , , WinID
    If (hThisGui = WinID) 
        Return
    GoTo Close

MoveCenter:
    MoveCenter()
    Return
    
Exit:
    DllCall("ClipCursor") 
    ExitApp

WM_MOUSEMOVE()   {
    Global prArea 
    Area := A_GuiControl 
    If (Area = prArea)
        Return
    GuiControl, -Redraw, % prArea
    GuiControl, +cD9952F, % prArea
    GuiControl, +Redraw, % prArea 
    GuiControl, -Redraw, % Area
    GuiControl, +c696969, % Area
    GuiControl, +Redraw, % Area
    If (prArea != "" && prArea != 5)
        Send(prArea, "Up")
    prArea := Area
    If (Area != 5)
        Send(Area, "Down") 
    SetTimer, MoveCenter, -1000    
} 

Send(n, mode)   {
    Static Send := ["Up|Left", "Up", "Up|Right", "Left", "", "Right", "Left|Down", "Down", "Down|Right"]
    This := StrSplit(Send[n], "|")
    SendInput % "{" This[1] " " mode "}" (This[2] != "" ? "{" This[2] " " mode "}" : "")   
    ; ToolTip % "{" This[1] " " mode "}" (This[2] != "" ? "{" This[2] " " mode "}" : "")   
} 
    
MoveCenter()   {
    Global hThisGui 
    WinGetPos, WinX, WinY, WinWidth, WinHeight, ahk_id %hThisGui%
    MouseMove, WinX+WinWidth/2, WinY+WinHeight/2, 0  
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

7

Re: Помощь для скрипта на события мыши

Мне для игр с эмуляторами, там и так всё мельтешит и мигает, а тут ещё курсор маячит...
Ещё раз большое спасибо. Сейчас нет возможности отблагодарить материально, но в следующий раз точно будет, и я думаю вскоре обращусь.