Macのフォーカス(アクティブウィンドウ)を把握する方法

Macにおいて、どのアプリによってウィンドウがアクティブ化されているのか把握する方法を紹介する。

これは、例えばMacのアクティブウィンドウが予期せず変更されてしまう場合に、どのアプリによってウィンドウのフォーカスが奪われているのかを知る上で非常に有用な方法だ。

なお、本記事の手順はMacRumosのフォーラムで紹介されていたものであり、僕が考えたものではない。

この場を借りてMacRumosフォーラムのBrian33氏、及びStack ExchangeのiMichael氏にお礼を申し上げる。

参考 Active window loses focusMacRumors Forums

アクティブウィンドウのステータスを把握する手順

1. ターミナルでPythonの仮想環境を作る

まず下記コマンドをターミナルで実行し、Pythonの仮想環境を作る。

/usr/bin/python3 -m venv ~/python-env

cd ~/python-env

source bin/activate

pip install pyobjc

コマンドを実行すると大量の文字列が表示されるが、処理が終わるまでしばらく待つ。

なお、処理が終わってもターミナルは開いたままにしておこう。

2. Pythonスクリプトファイルを作る

続いて下記のスクリプトをVisual Studio Codeなどのエディタに貼り付ける。

スクリプト
#!./bin/python3                                                                                    
# Prints current window focus.
# See: https://apple.stackexchange.com/q/123730
from AppKit import NSWorkspace
import time
workspace = NSWorkspace.sharedWorkspace()
active_app = workspace.activeApplication()['NSApplicationName']
print('Active focus: ' + active_app)
while True:
    time.sleep(1)
    prev_app = active_app
    active_app = workspace.activeApplication()['NSApplicationName']
    if prev_app != active_app:
        print('Focus changed to: ' + active_app)

スクリプトを貼り付けたら先ほど作ったPython仮想環境内のフォルダ直下にget_active_focus.pyという名前で保存する。

上記画像のようにユーザーディレクトリのPython仮想環境内(python-env)のフォルダ直下に保存しよう。

3. Pythonスクリプトを実行する

続いてターミナルに戻り、下記コマンドでPythonスクリプトを実行する。

python ./get_active_focus.py

すると現在のウィンドウがどのアプリによってフォーカスされているのか、ウィンドウのフォーカスが変わるたびにターミナル上にステータスが表示される。

あとはウィンドウのフォーカスをどのアプリが奪っているのか確認して完了だ。

まとめ

サードパーティアプリでも本記事の方法と同様のことが行えるものも存在するかもしれないが、本記事の手順の方が多少手間はかかるものの、余計なアプリを使用せずに済むので有用だと思う。

macOSではBluetoothデバイスのコントロールアプリ(LogicoolのG-Hubなど)によって予期せずアクティブウィンドウが変更されてしまうこともあるため、アクティブウィンドウが頻繁にフォーカスを失って困るという場合は本記事の方法で原因となっているアプリを特定してみよう。