rcmdnk's blog
Last update

20130723_AutoHotKey_200_200

AutoHotkeyのスクリプトで、 トレイアイコンを右クリックした時に出るメニューの追加方法。

AutoHotkeyではMenuコマンドを 使うことでスクリプトを立ち上げた時に出る トレイアイコン右クリックした時に出るメニューのカスタマイズが出来ます。

Menu

取り敢えず以下の例の様な事が分かれば大体使いこなせるかな、という感じです。

menu.ahk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#Persistent

; Prepare submenu
Menu, MySubMenu, Add, SubMenu1
Menu, MySubMenu, Add, SubMenu2
Menu, MySubMenu, Add, SubMenu3, SubMenuLabel3

; Add menus to Tray
Menu, Tray, Add, Menu1
Menu, Tray, Add
Menu, Tray, Add, Menu2
Menu, Tray, Add, Menu3, MenuLabel3
Menu, Tray, Add, SubMenu, :MySubMenu

; Check symbol
Menu2Value := 1
Menu, Tray, Check, Menu2
Menu, MySubMenu, Check, SubMenu3

; Icon settings
Menu, Tray, Icon, % A_LineFile . "\..\myTray.ico"
Menu, Tray, Icon, Menu3, % A_LineFile . "\..\myMenu.ico"

; Default menu
Menu, Tray, Default, Menu1

; End of the Auto-execute Section)
Return

; Each menu actions

Menu1:
  Msgbox, Menu1
Return

Menu2:
  Msgbox, Menu2
  if(Menu2Value == 1){
    Menu, Tray, Uncheck, Menu2
    Menu2Value := 0
  }else{
    Menu, Tray, Check, Menu2
    Menu2Value := 1
  }
Return

MenuLabel3:
  Msgbox, Menu3
Return

SubMenu1:
  Msgbox, SubMenu1
Return

SubMenu2:
  Msgbox, SubMenu2
Return

SubMenuLabel3:
  Msgbox, SubMenu3
  Menu, MySubMenu, ToggleCheck, SubMenu3
Return

;; Dummy mapping to keep a script running
;^!#+a::
;  Msgbox, DummyKey
;Return

上のスクリプトを実行するとトレイアイコンの右クリックメニューがこんな感じになります。

ahk menu

以下補足。

メニューの追加

新しいメニューを追加するにはAddを使い、

1
Menu, Tray, Add, Menu1

の様に書きます。これでMenu1という名前のメニューアイテムが今あるトレイメニューの下に出来ます。 4つめの引数を与えるとそれがラベルになります。

1
Menu, Tray, Add, Menu3, MenuLabel3

ラベルは

1
2
3
Menu2:
  Msgbox, Menu2
Return

といった感じにそのメニューアイテムをクリックした時に行う動作を設定する時に使う名前です。 4つ目の引数が省略された場合はメニューアイテム名がラベルになります。

この制限のためか、ラベルを設定しない場合には名前に空白は入れられません。

また、メニューアイテムを追加する際には対応するラベルの動作が指定されていないと Error: Target label does not exist.といったエラーが出ます。

Addの後に引数を与えないと区切り線を入れる事が出来ます。

サブメニュー

上ではまずMenu, Tray,...と、Trayを第一引数に与えてますが、 この部分はメニュー名になります。

Trayは右クリックした直後に現れるメニューで、 この下にサブメニューを作ることも出来ます。

1
Menu, Tray, Add, SubMenu, :MySubMenu

の様にするとSubMenuという名前のメニューアイテムが追加され マウスを持っていくとそのサブメニューが展開されます。 サブメニューを追加するときには4つめの引数に:を先頭に付けたサブメニュー名を書きます。

このサブメニュー内のアイテムを追加するにはTrayの代わりに最後に指定しているラベルMySubMenuを使って

1
Menu, MySubMenu, Add, SubMenu1

の様にしていけばOK。

ただしサブメニューをAddするよりも先にサブメニュー内の項目を設定しておかないとエラーが出るので 上の様にまずサブメニューを作ってから加える様にします。

Check

メニューアイテムの左側にチェックを付けることも出来ます。 チェックを付けるには

1
Menu, Tray, Check, Menu2

な感じでCheckを使います。 ここの3つ目の引数のところはメニューアイテム名(Addでも3つ目の引数)で ラベルではないのでちょっと注意。

チェックを外すにはUncheck、チェックをトグルするにはToggleCheckが使えます。

ただ、チェック状態を調べる方法が無い(と思う。。。)ので 中で色々状態を変化させたい場合には、ToggleCheckを使わずに Menu2:にあるように適当なグローバル変数(Menu2Value)を用意しておいて それを1と0でチェックしながら反転させる、と言った事をすると メニューのチェックを使ってスクリプト中の変数を変化させる事が出来ます。

アイコン

トレイアイコン自体を変えるには

1
Menu, Tray, Icon, % A_LineFile . "\..\myTray.ico"

とします。 A_LineFileは今読んでるスクリプトファイルへのパスで、..を足すことでファイルの有る フォルダへのパスになるので、ここではスクリプトと同じフォルダにある アイコンファイルを指定しています。

vim_ahkではこれを使ってモード変化時にトレイアイコンを変更する様にしています。

各メニューアイテムにもアイコンを表示させる事が出来て、

1
Menu, Tray, Icon, Menu3, % A_LineFile . "\..\myMenu.ico"

の様に第3引数にメニューアイテム名を入れてその後にアイコンへのパスを入れると メニューアイテムのアイコンになります。

ただし、このアイコンは上のCheckと同じ所に表示されるため、 Checkが入っているメニューではチェックが優先されてアイコンが表示されません。

Default

1
Menu, Tray, Default, Menu1

この指定をするとメニューアイテムの名前が太文字で表示される様になり、 トレイアイコンをダブルクリックした時に実行される動作がこのメニューのものになります。

デフォルトでは元からあるメニューの一番上にあるOpenになっています。

Delete/DeleteAll/NoStandard

上の例には無いですが、

1
Menu, Tray, Delete, Menu1

とするとMenu1を削除できます。

また、

1
Menu, Tray, DeleteAll

とすると全ての追加メニュー項目が削除されます。

ただ、これらで削除できるのは自分で追加したものだけで、元々あるメニューは削除されません。

もともとあるメニューを削除するには

1
Menu, Tray, NoStandard

とします。

これで自分のメニューだけを載せる事が出来ますが、 この場合、Exitもなくなるのでスクリプトを停止する手段を自分で用意しないと 止められなくなります。(タスクマネージャーとかから無理やりプロセスを消すしか無い。)

なのでこういった場合は自分でExitを作ってメニューに追加する必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#Persistent

Menu, NoStandard
Menu, Tray, Add, Menu1
Menu, Tray, Add, Exit

Return

Menu1:
  Msgbox, Menu1
Return

Exit:
  ExitApp
Return

;; Dummy mapping to keep a script running
;^!#+a::
;  Msgbox, DummyKey
;Return

こんな感じでExitAppを実行するとスクリプトが終了します。

^!#+a

上のスクリプトの最後に

1
2
3
^!#+a::
  Msgbox, DummyKey
Return

とありますが、これは単にスクリプトを終了させないためのダミーキーマップです。 何かしらのキーマップ設定があるとスクリプトは走り続けますが、 そうでないと一通り実行して終了してしまってトレイアイコンを調べられないので。

追記: 2017/11/22

このようなダミーマップをしなくても スクリプトの最初に

1
#Persistent

と書いておけばそのスクリプトはマップがある場合同様ExitAppなどを呼ばない限り終了しなくなります。

#Persistent

追記ここまで

Sponsored Links
Sponsored Links

« AutoHotkeyで短い連続入力を認識させる方法 AutoHotkeyでのGUI操作 »

}