1 (изменено: DD, 2014-10-25 20:07:59)

Тема: AHK: Множественные действия на левой и верхней границах экрана

http://i64.fastpic.ru/big/2014/1025/31/a5b7fb47dd8413bb8bb23fb9ad68a931.png

Давно мечтаю повесить действия на изображенные экранные области, по следующему формату:

#If right_edge(A_ScreenWidth - 2)
;...
#If
right_edge(x)
{
    CoordMode, Mouse
    MouseGetPos, x_pos
    return x_pos >= x
}

Сбыточно ли это? Думаю, здорово бы расширило возможности от одиночных кликов.

2 (изменено: serzh82saratov, 2014-10-25 20:22:47)

Re: AHK: Множественные действия на левой и верхней границах экрана

Если независимо от разрешения, и относительно экрана, то так:


CoordMode, Mouse

Loop
    ToolTip % WhatArea() 
    
WhatArea()  {
    Static R := [[0.0,0.5,0.05,1]
                , [0.0,0.05,0.05,0.5]
                , [0.0,0.0,0.05,0.05]
                , [0.05,0.0,0.5,0.05]
                , [0.5,0.0,1,0.05]]
    MouseGetPos, X, Y
    X := X / A_ScreenWidth, Y := Y / A_ScreenHeight
    For K, V in R
        If (X >= V[1] && X <= V[3] && Y >= V[2] && Y <= V[4])
            Return K
} 

Как привязать кнопку, думаю сообразите.

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

3 (изменено: DD, 2014-10-25 20:54:43)

Re: AHK: Множественные действия на левой и верхней границах экрана


CoordMode, Mouse

#If WhatArea() 
~LButton::
    ToolTip % WhatArea() 
return
#If

    
WhatArea()  {
    Static R := [[0.0,0.5,0.05,1]
                , [0.0,0.05,0.05,0.5]
                , [0.0,0.0,0.05,0.05]
                , [0.05,0.0,0.5,0.05]
                , [0.5,0.0,1,0.05]]
    MouseGetPos, X, Y
    X := X / A_ScreenWidth, Y := Y / A_ScreenHeight
    For K, V in R
        If (X >= V[1] && X <= V[3] && Y >= V[2] && Y <= V[4])
            Return K
}

Огромное спасибо, пример замечательный! Только недокумекаю, как задавать условия на действия в определенных областях? Т.е. сейчас, если я правильно понимаю, это как бы общая функция. Интересует, как ставить условия: "если активна нижняя половина левой границы экрана, делать этак", "если активна правая половина верхней границы — делать раз-этак" и т.д.?

4

Re: AHK: Множественные действия на левой и верхней границах экрана

как ставить условия: после клика по нижней половине левой границы делать этак, после клика по правой половине верхней границы делать раз-этак и т.д.?

Думал что догадаетесь.


CoordMode, Mouse

#If (Area := WhatArea())
LButton::
    If Area = 1
        MsgBox 1
    Else If Area = 2
        MsgBox 2
    Else If Area = 3
        MsgBox 3
    Else If Area = 4
        MsgBox 4
    Else If Area = 5
        MsgBox 5
    Return
#If
    
WhatArea()  {
    Static R := [[0.0,0.5,0.05,1]
                , [0.0,0.05,0.05,0.5]
                , [0.0,0.0,0.05,0.05]
                , [0.05,0.0,0.5,0.05]
                , [0.5,0.0,1,0.05]]
    MouseGetPos, X, Y
    X := X / A_ScreenWidth, Y := Y / A_ScreenHeight
    For K, V in R
        If (X >= V[1] && X <= V[3] && Y >= V[2] && Y <= V[4])
            Return K
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Множественные действия на левой и верхней границах экрана

Ну, кнопку я таки привязал — а это уже заоблочные вещи))) Благодарю!

6 (изменено: serzh82saratov, 2014-10-26 00:42:23)

Re: AHK: Множественные действия на левой и верхней границах экрана

Думаю, здорово бы расширило возможности от одиночных кликов.

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

     
    ;  http://forum.script-coding.com/viewtopic.php?pid=87738#p87738
    
#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1
OnExit, OnExit
OnMessage(0x200, "WM_MOUSEMOVE")
CoordMode Mouse
VarSetCapacity(RECT, 16 ,0)
Global prArea, Area, Color := "D9952F", Light := "696969"
wside := 150, hside := 70, margin := 5

Action := [["Action1","Action1"]
        , ["Action2","Action2"]
        , ["Action3","Action3"]
        , ["Action4","Action4"]
        , ["Отмена",""]
        , ["Action5","Action5"]
        , ["Action6","Action6"]
        , ["Action7","Action7"]
        , ["Action8","Action8"]]

Gui, -DPIScale +AlwaysOnTop -Caption +HWNDhThisGui +E0x08000000  
Gui, Font, s12
Gui, Margin, 0, 0
Loop 9  { 
    Gui, Add, Progress, % (Mod(A_Index+2, 3) ? "x+" margin : "x0")
        . " y" ((A_Index-1)//3)*(hside+margin) " h" hside " w" wside " c" Color " v" A_Index, % A_Index = 5 ? 0 : 100
    Gui, Add, Text, xp yp wp hp BackgroundTrans +0x201 vText%A_Index%, % Action[A_Index][1]
} 
Return 
    
#If NeedCoords(0, 0, 11, 11)

RButton::
    Gui, Show, NA x11 y11
    WinSet, Transparent, 210, ahk_id %hThisGui%  
    Show := 1, DllCall("GetWindowRect","uint",hThisGui,"uint",&RECT) 
    DllCall("ClipCursor","uint",&RECT)
    DllCall("ShowCursor", "uint", 1)
    SetTimer, IsThisGui, 100  
    GoSub MoveCenter
    Return

#If Show 

~RButton Up::
    GoSub Close
    MouseMove, 0, 0, 0
    Try GoSub % Action[Area][2] 
    Return

#If

IsThisGui:
    MouseGetPos, , , WinID
    DllCall("ClipCursor","uint",&RECT)
    If (WinID = hThisGui || WinID = "") 
        Return
    GoTo Close
    
MoveCenter:
    WinGetPos, WinX, WinY, WinWidth, WinHeight, ahk_id %hThisGui%
    MouseMove, WinX+WinWidth/2, WinY+WinHeight/2, 0
    Color(Color, prArea), Color(Light, prArea := 5)
    Return
 
Close: 
    Gui, Hide 
    SetTimer, IsThisGui, Off 
    DllCall("ClipCursor"), Show := 0 
    SetTimer, MoveCenter, Off 
    Color(Color, prArea), prArea := 5
    Return
    
OnExit:
    DllCall("ClipCursor") 
    ExitApp
    
WM_MOUSEMOVE()   {
    Area := A_GuiControl
    If (Area = prArea)
        Return
    Color(Color, prArea), prArea := Area
    If (Area = "")
        Return
    Color(Light, Area)
    SetTimer, MoveCenter, % Area = 5 ? "Off" : -1200
} 

NeedCoords(x1, y1, x2, y2)  { 
    MouseGetPos, X, Y
    Return X >= x1 && X <= x2 && Y >= y1 && Y <= y2
} 

Color(c, ctrl)  { 
    GuiControl, +c%c%, % ctrl
    GuiControl, +Redraw, % ctrl 
    GuiControl, +Redraw, Text%ctrl%
}

Action1:
Action2:
Action3:
Action4:
Action5:
Action6:
Action7:
Action8: 
    MsgBox,,, % A_ThisLabel, 0.7
    Return
 

RButton зажимаем в левом верхнем углу экрана, отпускаем где надо.


RButton, цвета, угол экрана - конечно по вкусу.

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

7

Re: AHK: Множественные действия на левой и верхней границах экрана

Серж, это гениально! По нему Коллекция плачет! Это будет отечественное "радиальное меню". То есть квадрадиальное)))

8

Re: AHK: Множественные действия на левой и верхней границах экрана

По-моему, поле "Отмена" лишнее, только место зря занимает. Проще убрать DllCall("ClipCursor","uint",&RECT) и делать отмену по отпусканию RButton вне поля. Сам пользуюсь подобным меню, но появление его просто посажено на одну из кнопок мыши.

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

9

Re: AHK: Множественные действия на левой и верхней границах экрана

teadrinker
Ну это всё добавлять по вкусу, кому как.

Но для меня всё удобство тут именно в ClipCursor. Я почти не целюсь, то есть всё задаётся направлением мыши, и она никуда не убежит, также как и угол экрана. Ну и также то, что всё это делается только одним кликом.

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

10 (изменено: Xwansu, 2014-11-02 18:17:17)

Re: AHK: Множественные действия на левой и верхней границах экрана

Тоже давно пользуюсь похожей штукой, у меня задействован правый край экрана, используется 2 хоткея по ПКМ и СКМ.