見出し画像

AutoHotkeyでアプリ切換えメニューの作成

やりたいことはこんな感じ

・アプリ選択するときにマウスでタスクバーまでもっていくのがめんどう。
・キーボードだけでアプリ切換えができる。
・Alt + tabやCtrl + Alt + tabだと複数ウインドウ(10個とか)開いていると探すのがめんどくさい。(アプリごとにまとめてほしい。)
・Win + T からのカーソルキーで選択もいいけど、複数ディスプレイを使っていると、メインのタスクバーでしか動かないのが面倒。

メインプログラム側の設定

Ctrl + Alt + tabでマウスカーソルの横にAHKで作るメニューを表示させる設定。AppSelect.ahkを呼びだしている。

^!tab::
    if(WinExist("ahk_class #32768")){
        return
    }
    Run, D:\47_AutoHotKey\AppSelect.ahk
    CoordMode, Mouse,Screen
    BlockInput, MouseMove
    MouseGetPos, mx,my
    WinWait,ahk_class #32768,,2
    WinGetPos,wx,wy,,,ahk_class #32768
    MouseClick,Left,%wx%,%wy%
    MouseMove, mx,my
    BlockInput, MouseMoveOFF
return

サブプログラム(サブのファイル)側の設定。

#NoEnv
SendMode, Input
SetTitleMatchMode, 2
#InstallKeybdHook
#UseHook
#NoTrayIcon

; マウス位置などの取得
CoordMode, Mouse, Screen
CoordMode, Menu, Screen
MouseGetPos, mx, my
WinGetPos, wx, wy, wwi,whe,!

; いま開いているウインドウの中で引数で設定したアプリのメニューを設定する関数
; ウインドウを開いていないときは立ち上げるよう動作を設定したラベルを設定。
; 直近5つまでを開くようにする。
MkSubMenu(AHK,EXE,ByRef IDD1,ByRef IDD2,ByRef IDD3,ByRef IDD4,ByRef IDD5){
    WinGet, id, list,%AHK% %EXE% , , Program Manager
    if id = 0
        Menu,ctMenu,Add,%EXE%,%EXE%_AppSelectID0
    Else{
        if id >5
            LoopNum = 5
        Else{
            LoopNum = %id%
        }
        Loop, %LoopNum%
        {
            StringTrimRight, this_idP, id%A_Index%, 0
            ; WinGetClass, this_class, ahk_id %this_idP%
            WinGetTitle, this_title, ahk_id %this_idP%
            Menu,Sub%EXE%,Add,%this_title%,%EXE%_AppSelectID%A_Index%
            Menu,ctMenu,Add,%EXE%`t&%KEY%, :Sub%EXE%
            IfMsgBox, NO, Break
        }
        IDD1 := id1
        IDD2 := id2
        IDD3 := id3
        IDD4 := id4
        IDD5 := id5
    }
}

; 設定した関数を使う。
MkSubMenu("ahk_exe","Code.exe",CodeID1,CodeID2,CodeID3,CodeID4,CodeID5)
MkSubMenu("ahk_exe","msedge.exe",MsID1,MsID2,MsID3,MsID4,MsID5)
MkSubMenu("ahk_class","PPTFrameClass",PPTID1,PPTID2,PPTID3,PPTID4,PPTID5)
MkSubMenu("ahk_class","XLMAIN",EXCID1,EXCID2,EXCID3,EXCID4,EXCID5)
; Menu,ctMenu,Add,Chrome`t&U,AppSelect_05
; Menu,ctMenu,Add,Blender`t&U,AppSelect_06
; Menu,ctMenu,Add,DisplaySW`t&U,AppSelect_99

; メニュー画面の設定
WinSet,Transparent,90,customMenuAHK
WinSet,Top,,customMenuAHK
SysGet,x,76
SysGet,y,77
SysGet,w,78
SysGet,h,79
WinMove,customMenuAHK,,%x%,%y%,%w%,%h%
Menu,ctMenu,Show,%mx%,%my%
cmenuCancel:
ExitApp

; マウスカーソルをアクティブなウインドウのセンターに移動させる関数
MouseMoveCenter(){
    WinGetPos, X,Y,winW,WinH,A
    mX:=X + winW/2
    mY:=Y + winH/2
    MouseMove, %mX%,%mY%
}

; 引数のアプリが動いていなかったら立ち上げる。
AppSelect(App,AppPath){
    Process,Exist,%App%
    If %ErrorLevel% <> 0
        WinActivate,ahk_pid %ErrorLevel%
    Else{
        Run,%AppPath%
        Sleep, 600
    }
    MouseMoveCenter()
}

; ラベル設定
; ラベル部分を関数にできないのが悩み。
; めんどくさいけど他に方法がわからないので書き連ねている。
Code.exe_AppSelectID0:
    AppSelect("Code.exe","D:\47_AutoHotKey\bat\_RunOpenVScode.vbs")
Return
Code.exe_AppSelectID1:
    WinActivate, ahk_id %CodeID1%
    MouseMoveCenter()
Return
Code.exe_AppSelectID2:
    WinActivate, ahk_id %CodeID2%
    MouseMoveCenter()
Return
Code.exe_AppSelectID3:
    WinActivate, ahk_id %CodeID3%
    MouseMoveCenter()
Return
Code.exe_AppSelectID4:
    WinActivate, ahk_id %CodeID4%
    MouseMoveCenter()
Return
Code.exe_AppSelectID5:
    WinActivate, ahk_id %CodeID5%
    MouseMoveCenter()
Return

msedge.exe_AppSelectID1:
    WinActivate, ahk_id %MsID1%
    MouseMoveCenter()
    Return
msedge.exe_AppSelectID2:
    WinActivate, ahk_id %MsID2%
    MouseMoveCenter()
    Return
msedge.exe_AppSelectID3:
    WinActivate, ahk_id %MsID3%
    MouseMoveCenter()
    Return
msedge.exe_AppSelectID4:
    WinActivate, ahk_id %MsID4%
    MouseMoveCenter()
    Return
msedge.exe_AppSelectID5:
    WinActivate, ahk_id %MsID5%
    MouseMoveCenter()
    Return

PPTFrameClass_AppSelectID0:
    AppSelect("POWERPNT.EXE","POWERPNT.EXE")
return
PPTFrameClass_AppSelectID1:
    WinActivate, ahk_id %PPTID1%
    MouseMoveCenter()
    Return
PPTFrameClass_AppSelectID2:
    WinActivate, ahk_id %PPTID2%
    MouseMoveCenter()
    Return
PPTFrameClass_AppSelectID3:
    WinActivate, ahk_id %PPTID3%
    MouseMoveCenter()
    Return
PPTFrameClass_AppSelectID4:
    WinActivate, ahk_id %PPTID4%
    MouseMoveCenter()
    Return
PPTFrameClass_AppSelectID5:
    WinActivate, ahk_id %PPTID5%
    MouseMoveCenter()
    Return

XLMAIN_AppSelectID0:
    AppSelect("EXCEL.EXE","EXCEL.EXE")
    MouseMoveCenter()
    Return
XLMAIN_AppSelectID1:
    WinActivate, ahk_id %EXCID1%
    MouseMoveCenter()
    Return
XLMAIN_AppSelectID2:
    WinActivate, ahk_id %EXCID2%
    MouseMoveCenter()
    Return
XLMAIN_AppSelectID3:
    WinActivate, ahk_id %EXCID3%
    MouseMoveCenter()
    Return
XLMAIN_AppSelectID4:
    WinActivate, ahk_id %EXCID4%
    MouseMoveCenter()
    Return
XLMAIN_AppSelectID5:
    WinActivate, ahk_id %EXCID5%
    MouseMoveCenter()
    Return

なげーーーー。
Menuを使っているけど、GUIを使ってボタン設定してあげた方がいいかなと考えているけれど、まぁこんな感じで。
つづく。

いいなと思ったら応援しよう!