1 (изменено: terra-4, 2017-01-17 15:18:21)

Тема: AHK: Анимация при нажатии ЛКМ

Всем Хорошего времени суток.

Пожалуйста, помогите  со скрипом.

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

На основе этой возможности в Windows, мне удалось собрать это:

~LButton::
	Sleep 80
		SendInput {LControl}
return

К сожалению, иногда работает некорректно, вызывая незапланированные действия, возможно, это связано с задержкой…

Может у кого есть что то лучше поделитесь, пожалуйста.

2

Re: AHK: Анимация при нажатии ЛКМ

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

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3 (изменено: terra-4, 2017-01-17 15:55:58)

Re: AHK: Анимация при нажатии ЛКМ

belyankin12, да нажатие CTLR всегда, после нажатии ЛКМ, но как некорректные действие можно обойти.. я поставил "Sleep 80" возможно тут только подбирать паузу между действиями.

А есть у вас, идея как что то подобное сделать средствами AutoHotkey?

4

Re: AHK: Анимация при нажатии ЛКМ

Задача была про анимацию щелчков ЛКМ. И она успешно решается стандартными средствами. При чём тут SendInput {LControl}? Для чего вообще скрипт писать?

5

Re: AHK: Анимация при нажатии ЛКМ

terra-4, некорректные действия можно обойти только тогда, когда данное окно не реагирует на клавишу LCRTL - не важно какие задержки. Возможно ypppu объяснит, как можно это сделать стандартными средствами.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

6

Re: AHK: Анимация при нажатии ЛКМ

Сомневаюсь, что без gdi+ что-то можно путное сделать.

7

Re: AHK: Анимация при нажатии ЛКМ

Как вариант можно отправить нажатие ctrl в окно, которое не реагирует на него. Например нажал ЛКМ - разворачивается заранее открытое окно блокнота, туда отправляется ctrl, окно сворачивается. Правда я бы сказал как это называется, да тут форум приличный

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

8 (изменено: Malcev, 2017-01-18 12:25:01)

Re: AHK: Анимация при нажатии ЛКМ

#NoEnv
OnExit, ExitSub
CoordMode Mouse, Screen
Setup()

~LButton::ShowRipple(LeftClickRippleColor)
~RButton::ShowRipple(RightClickRippleColor)
~LControl Up::ShowRipple(MouseIdleRippleColor)

Setup()
{
    Global
    RippleWinSize := 200
    RippleStep := 10
    RippleMinSize := 10
    RippleMaxSize := RippleWinSize - 20
    RippleAlphaMax := 0x60
    RippleAlphaStep := RippleAlphaMax // ((RippleMaxSize - RippleMinSize) / RippleStep)
    RippleVisible := False
    LeftClickRippleColor := 0xff0000
    RightClickRippleColor := 0x0000ff
    MouseIdleRippleColor := 0x008000
    
    DllCall("LoadLibrary", Str, "gdiplus.dll")
    VarSetCapacity(buf, 16, 0)
    NumPut(1, buf)
    DllCall("gdiplus\GdiplusStartup", UIntP, pToken, UInt, &buf, UInt, 0)
    
    Gui Ripple: -Caption +LastFound +AlwaysOnTop +ToolWindow +Owner +E0x80000
    Gui Ripple: Show, NA, RippleWin
    hRippleWin := WinExist("RippleWin")
    hRippleDC := DllCall("GetDC", UInt, 0)
    VarSetCapacity(buf, 40, 0)
    NumPut(40, buf, 0)
    NumPut(RippleWinSize, buf, 4)
    NumPut(RippleWinSize, buf, 8)
    NumPut(1, buf, 12, "ushort")
    NumPut(32, buf, 14, "ushort")
    NumPut(0, buf, 16)
    hRippleBmp := DllCall("CreateDIBSection", UInt, hRippleDC, UInt, &buf, UInt, 0, UIntP, ppvBits, UInt, 0, UInt, 0)
    DllCall("ReleaseDC", UInt, 0, UInt, hRippleDC)
    hRippleDC := DllCall("CreateCompatibleDC", UInt, 0)
    DllCall("SelectObject", UInt, hRippleDC, UInt, hRippleBmp)
    DllCall("gdiplus\GdipCreateFromHDC", UInt, hRippleDC, UIntP, pRippleGraphics)
    DllCall("gdiplus\GdipSetSmoothingMode", UInt, pRippleGraphics, Int, 4)
    
    MouseGetPos _lastX, _lastY
    SetTimer MouseIdleTimer, 5000
    Return

MouseIdleTimer:
    MouseGetPos _x, _y
    if (_x == _lastX and _y == _lastY)
        ShowRipple(MouseIdleRippleColor, _interval:=20)
    else
        _lastX := _x, _lastY := _y
    Return
}

ShowRipple(_color, _interval:=10)
{
    Global
    if (RippleVisible)
    	Return
    RippleColor := _color
    RippleDiameter := RippleMinSize
    RippleAlpha := RippleAlphaMax
    RippleVisible := True

    MouseGetPos _pointerX, _pointerY
    SetTimer RippleTimer, % _interval
    Return

RippleTimer:
    DllCall("gdiplus\GdipGraphicsClear", UInt, pRippleGraphics, Int, 0)
    if ((RippleDiameter += RippleStep) < RippleMaxSize) {
        DllCall("gdiplus\GdipCreatePen1", Int, ((RippleAlpha -= RippleAlphaStep) << 24) | RippleColor, float, 3, Int, 2, UIntP, pRipplePen)
        DllCall("gdiplus\GdipDrawEllipse", UInt, pRippleGraphics, UInt, pRipplePen, float, 1, float, 1, float, RippleDiameter - 1, float, RippleDiameter - 1)
        DllCall("gdiplus\GdipDeletePen", UInt, pRipplePen)
    }
    else {
        RippleVisible := False
        SetTimer RippleTimer, Off
    }

    VarSetCapacity(buf, 8)
    NumPut(_pointerX - RippleDiameter // 2, buf, 0)
    NumPut(_pointerY - RippleDiameter // 2, buf, 4)
    DllCall("UpdateLayeredWindow", UInt, hRippleWin, UInt, 0, UInt, &buf, Int64p, (RippleDiameter + 5) | (RippleDiameter + 5) << 32, UInt, hRippleDC, Int64p, 0, UInt, 0, UIntP, 0x1FF0000, UInt, 2)
    Return
}

ExitSub:
DllCall("DeleteObject", "ptr", hRippleBmp)
DllCall("DeleteDC", "ptr", hRippleDC)
DllCall("gdiplus\GdipDeleteGraphics", "ptr", pRippleGraphics)
DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
   DllCall("FreeLibrary", "ptr", hModule)
ExitApp

9 (изменено: ypppu, 2017-01-17 22:32:30)

Re: AHK: Анимация при нажатии ЛКМ

Вот так показывает анимацию. Но в стандартном варианте мелькания.

~LButton:: Send {LCtrl}

Malcev, ещё бы для полного счастья учесть чёрный фон, на нём не видно.

10

Re: AHK: Анимация при нажатии ЛКМ

Можно регулировать прозрачность RippleAlphaMax.
При значении 500 у меня видно.

11

Re: AHK: Анимация при нажатии ЛКМ

Объекты, созданные в начале скрипта, обязательно должны удаляться. Ну и с размерностью опять беда.

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

12 (изменено: Malcev, 2017-01-18 09:02:37)

Re: AHK: Анимация при нажатии ЛКМ

Объекты удалил.
Хотя, судя по этой теме это делать вроде необязательно.
Виндовс сам все подчистит при выходе из программы:
http://stackoverflow.com/questions/3015 … g-an-appli
Размерность сам точно не поменяю.
Беды с ней особо не вижу - на 64 бит у меня работает.

13

Re: AHK: Анимация при нажатии ЛКМ

Malcev, Спасибо, за скрипт!

Подскажите пожалуйста.. можно ли изменить  толщину кругов? если да то какой параметр отвечает за это?

14 (изменено: Malcev, 2017-01-18 19:04:41)

Re: AHK: Анимация при нажатии ЛКМ

DllCall("gdiplus\GdipCreatePen1", Int, ((RippleAlpha -= RippleAlphaStep) << 24) | RippleColor, float, 30, Int, 2, UIntP, pRipplePen)
        DllCall("gdiplus\GdipDrawEllipse", UInt, pRippleGraphics, UInt, pRipplePen, float, 15, float, 15, float, RippleDiameter - 25, float, RippleDiameter - 25)