web-dev-qa-db-ja.com

イベントに応じて、Windows10のクリック位置にカスタムアニメーションを表示する

カーソルの外観の変更に関するプログラムはたくさんあります。特にMacOSの場合、マウスイベントなどで、美しいアニメーションや図を使用してカーソルの外観を変更できます。私はWindows10用の Mouseposé アプリの同じ代替品を探していましたが、これまでのところ十分に幸運ではありませんでした。あなたがそのようなアプリを知っているなら、私に知らせてください。ただし、 CursorFX のように、Windowsでかなりうまく機能するもの(ただし、希望どおりではない)がいくつか見つかりました。 SpotOn TheMouse ;前者は適切に見えますが、Windows 10のアイコンと視覚的に互換性がなく、後者も同様ですが、品質が低いという欠点があります。

私が聞きたいのは、前述のアプリとは別です。一部のスクリプトはWindowsのホットキー用に作成できますが、この post の回答によると、結果として次のようなものが生成されます。

enter image description here

ご覧のとおり、 Ctrl キーはマウスボタンに置​​き換えられ、前述のアプリと同様の機能を作成します。しかし、このデフォルトのWindows 10アニメーションは非常に醜く、巨大で、非常に速く、不適切です。

可能であれば、AutoHotKeyスクリプトを使用して、マウスボタンをクリックすると次のゴージャスなSVGアニメーションが表示される状況を作成したいと思います。どうすればよいですか?すべてのあなたの助けをありがとう。

enter image description here

アニメーション化されたSVG( Spinning-Circles.SVG )ファイル(IE以外のブラウザーで開くことで再生できます)Windows10のクリック位置に配置したいアニメーション。

4
Qaher

この効果を生成するAutoHotkeyスクリプトがありますが、Windows 10でまだテストしていませんが、そこでも機能すると思います。自動化されたマウスクリックイベントを表示するために同じ機能が必要でした。私は完全なソースコードを投稿しました ここ 試して/使用/変更して、それがあなたのために働くかどうか確かめてください。

スクリプトは、クリックされたポイントから同心円を描画することにより、アニメーションを最初から生成します(SVGまたはGIFファイルを表示するのではありません)。これにより、同心リング、色の選択、フェードレート、サイズ、厚さなどを調整できます。これらの変数は現在ハードコーディングされていますが、アニメーションの外観を試してみたい場合はグループ化されています。描画された円はアンチエイリアス処理されていないため、表示するSVGほど洗練されていませんが、効果は同じです。

スクリプトを実行するには、AutoHotkeyを起動して実行するだけでなく、 GDIPライブラリ をダウンロードしてスクリプトと同じフォルダにドロップするという基本的な知識が必要です。試してみるのに問題がある場合はコメントを残してください。

3
JJohnston2

これは別の簡単なAHKスクリプトです。

  • 外部ライブラリは必要ありません。
  • Windows10でスムーズに動作します。
  • スクリプト内のリップルパラメータを簡単に編集できます。

原作者: https://www.autohotkey.com/boards/viewtopic.php?t=896

#NoEnv
CoordMode Mouse, Screen
Setup()

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

Setup()
{
    Global
    RippleWinSize := 50
    RippleStep := 2
    RippleMinSize := 5
    RippleMaxSize := RippleWinSize - 20
    RippleAlphaMax := 0xff
    RippleAlphaStep := RippleAlphaMax // ((RippleMaxSize - RippleMinSize) / (RippleStep*1.0))
    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:=40)
    else
        _lastX := _x, _lastY := _y
    Return
}

ShowRipple(_color, _interval:=20)
{
    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
}
1
kpurens