晴耕雨読

working in the fields on fine days and reading books on rainy days

AutoHotkeyで通知領域のカレンダーを表示する

Window 10 + AutoHotkey でマウスが画面右下に来た時に、通知領域のカレンダーを表示する方法について説明します。

基本的には、「AutoHotkeyでMacのホットコーナーを実装する」 を使いますので、まずはこの記事からコードをコピーします。 ここでは HotCorners.ahk というファイルで保存します。

#Persistent  ; スクリプトを常駐させる
SetTimer, HotCorners, 0  ; タイマーを使ってサブルーチンを0秒ごとに実行する
return
HotCorners:
CoordMode, Mouse, Screen  ; スクリーン上のマウス座標を取得する

IsCorner(cornerID)
{
  WinGetPos, X, Y, Xmax, Ymax, Program Manager  ; スクリーンのサイズを取得
  MouseGetPos, MouseX, MouseY  ; マウス座標の取得
  T = 5  ; マウス座標の許容範囲
  CornerTopLeft := (MouseY < T and MouseX < T)  ; 左上判定
  CornerTopRight := (MouseY < T and MouseX > Xmax - T)  ; 右上判定
  CornerBottomLeft := (MouseY > Ymax - T and MouseX < T)  ; 左下判定
  CornerBottomRight := ((MouseY > Ymax - T and MouseX > Xmax - T) or (OutputVarControl = "TrayShowDesktopButtonWClass1"))  ; 右下判定

  if (cornerID = "TopLeft"){
    return CornerTopLeft
  }
  else if (cornerID = "TopRight"){
    return CornerTopRight
  }
  else if (cornerID = "BottomLeft"){
    return CornerBottomLeft
  }
  else if  (cornerID = "BottomRight") {
    return CornerBottomRight
  }
}

そして、HotCorners.ahk の画面右下に来た時の処理部分で、TrayClockWClass1 をクリックするように処理を修正します。

if IsCorner("BottomRight")
{
  ; 通知領域にフォーカスをあてる
  WinActivate, ahk_class Shell_TrayWnd
  ; ESCは2回目のときにカレンダーが閉じるようにするため
  Send {ESC}
  ; 通知領域の時計/カレンダー部分をクリックする
  ControlClick, TrayClockWClass1, ahk_exe explorer.exe ahk_class Shell_TrayWnd

  Loop
  {
    if ! IsCorner("BottomRight")
      break ; マウスが画面右下から離れたときに処理を抜ける
  }
}

ポイントは、対象のコントロール(TrayClockWClass1)をクリックする前に、通知領域にフォーカスをあてる点です。 これがないと、ただしく反応しない場合があります。 さらに、画面右下1回目のときはカレンダーを表示して、2回目のときは非表示にするために、ESCを送信しています。

画面上のコントロールの取得には AutoHotkey インストール時に一緒に付いてくる Window Spy を使うのがオススメです。 Windowsの検索 > Window Spy > Follow Mouse のチェックボックスを入れる > 対象のコントロールの上にマウスを移動 > そのときの ahk_class と ClassNN をメモしておく。という流れでコントロール名を取得することができるので、AHK の関数である WinActivate と Control* を使って操作ができます。

以上です。