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を使ってボタン設定してあげた方がいいかなと考えているけれど、まぁこんな感じで。
つづく。