AutoHotkey でメニューの表示位置がずれる時は CoordMode を調べること

以下のようにポップアップメニュー popupmenu1 を表示するスクリプトを書いていたのだが、

; <<< メニューつくってるところは割愛 >>>

; プライマリモニタの中央座標を取得
posobj := get_display_center_pos()
showx := posobj.x
showy := posobj.y

; 取得した中央位置でメニューを表示
Menu, popupmenu1, Show, %showx%, %showy%

メニュー表示位置がどうも中央位置からずれる。見た感じ アクティブウィンドウ次第で位置が変化している ように見える。何が起きているのだろう?とハマっていた。

原因

原因は単純で、 CoordMode という「座標指定時の基準値をどこにするのか」設定が スクリーン上での絶対位置になってなかった から。

AutoHotkey ではこれがデフォルトでは「アクティブウィンドウの左上からの相対座標」になっている。なので、上記のコードは実質

; activewindow_x, activewindow_y が
; アクティブウィンドウ左上座標を表しているとする
Menu, popupmenu1, Show, %showx% + activewindow_x, %showy% + activewindow_x

こうなっているに等しい。

解決

以下のように CoordMode Menu, Screen にて「スクリーン上での絶対位置にする」設定を明示的に指定する。

; デフォは座標指定がアクティブウィンドウ相対になっているので
; スクリーン絶対に直す.
CoordMode Menu, Screen
Menu, menuname1, Show, %showx%, %showy%