blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

「マウスカーソルを Cannon Smash みたいに操作」する AutoHotkey 用スクリプト

Windows 7 のマウスカーソルを Cannon Smash みたいに操作できる方法があれば教えてください。 キャノンスマッシュという卓球ゲームでは、キーボードの盤面を画面に見立て.. - 人力検索はてなの一回答を書いてみた。質問者の要望通り、[無変換] + [文字]でマウス・カーソルの位置を移動するよう設定した。関数 MoveMouse の引数にマウスの行き先を記述する。具体的には、「左上」のように、水平の移動先と垂直移動先を順に指定するだけでよい。マルチモニターにも対応している。詳しくはソースを参照のこと。
Windows 7 はもちろんのこと、Windows XPWindows Vista でも動作するはずだ。

ソース

;;; http://q.hatena.ne.jp/1280844030
;;; Windows 7 のマウスカーソルを Cannon Smash みたいに操作できる方法があれば教えてください。
;;; キャノンスマッシュという卓球ゲームでは、キーボードの盤面を画面に見立てて、そのあたりの位置にあるキーを押します。例えば Q なら左上、L なら右といった感じです。
;;; Windows で、例えば「無変換」を押しながらそういったキーを押せば大まかにマウスポインタが動くようにできますか。細かい操作はできなくても大丈夫です。
;;; exe じゃなくて AutoHotkey なら、さらに良いです。



#NoEnv
#SingleInstance, Force


;;; CoordMode - AutoHotkeyJp
;;; http://sites.google.com/site/autohotkeyjp/reference/commands/CoordMode
CoordMode, Mouse, Screen


;;; ゆとりを設定
margin = 50


;;; マルチモニタの環境で特定のモニター内を移動するときは、
;;; ("左上", 2) のように、モニターの番号を指定すること
;;; モニターの番号を指定しないときは、仮装スクリーンを含めたスクリーン全体を移動する
vk1Dsc07B & sc010::MoveMousePointer("左上") ; [無変換] + [Q]
vk1Dsc07B & sc01E::MoveMousePointer("左中") ; [無変換] + [A]
vk1Dsc07B & sc02C::MoveMousePointer("左下") ; [無変換] + [Z]
vk1Dsc07B & sc018::MoveMousePointer("右上") ; [無変換] + [O]
vk1Dsc07B & sc026::MoveMousePointer("右中") ; [無変換] + [L]
vk1Dsc07B & sc034::MoveMousePointer("右下") ; [無変換] + [.]

return


;;; MouseMove - AutoHotkeyJp
;;; http://sites.google.com/site/autohotkeyjp/reference/commands/MouseMove
MoveMousePointer(pos="中中", monitorNo=0)
{
    StringSplit, pos, pos
    x := GetDestination("x", pos1, monitorNo)
    y := GetDestination("y", pos2, monitorNo)

    MouseMove, %x%, %y%, 2
    return
}


GetDestination(coordinate, str, monitorNo)
{
    global margin

    if (monitorNo = 0)
    {
        ;; 組み込み変数 - AutoHotkeyJp
        ;; http://sites.google.com/site/autohotkeyjp/reference/Variables
        SysGet, VirtualWidth, 78
        SysGet, VirtualHeight, 79

        mX := 0
        mY := 0
        mW := VirtualWidth
        mH := VirtualHeight
    }
    else
    {
        ;; neue cc - AutoHotKeyによるマウスカスタマイズとマルチディスプレイのためのスクリプト
        ;; http://neue.cc/2009/11/17_219.html
        SysGet, m, MonitorWorkArea, %monitorNo%

        mX := mLeft
        mY := mTop
        mW := mRight - mLeft
        mH := mBottom - mTop
    }

    if (margin = "")
        margin := 0

    mX += margin
    mY += margin
    mW -= margin
    mH -= margin



    if (str = "中")
    {
        return % (coordinate = "x") ? mW // 2
                                    : mH // 2
    }
    else
    {
        return % (str = "上") ? mY
              :  (str = "下") ? mH
              :  (str = "左") ? mX
              :                 mW
    }
}