MacのCmd-Tabのデフォルトの動作はアプリケーションの一覧が出てきて その中から選択する、という動作です。
さらにCmd-`を使うとアプリケーション内でのウィンドウを使うと、そのアプリケーション内のウィンドウ一覧が出てきて選択することが出来ます。
一方、Windowsで同じ様な動作を行うAlt-Tabは、最初から立ち上がっているウィンドウ全てから選択する、というもの。
Windowsを先に使っていた事もあって一括で選択したい、ということでMacでも代替ツールを探してた所 HyperSwitchを見つけずっと使っています。これを入れるとWindowsのAlt-Tab的な感覚ですべてのウィンドウ選択が出来る様になります。
ただ、このHyperSwitchがたまに動作しなくなることが前々からあって、今回調べてみた所原因はわかった感じでした。
HyperSwitch
WindowsのAlt-Tab動作を実現するアプリ。
常駐型で、Cmd-Tabなどをショートカットキーで登録すると Cmd-TabでWindowsの様なすべてのウィンドウからの選択が出来るようになります。
表示も、Macデフォルトの選択だとアプリのアイコンが出てきますが、 HyperSwitchだと各ウィンドウ現在の状態が表示されるのでよりわかりやすくなります。(特にWindowsユーザーにとっては。)
また、アプリ内の選択も出来る様になっています。 Macの機能でもCmd-`というショートカットがあって、これを一回押すと次のウィンドウへ、また次へ、と巡回することは出来るのですが、 HypwerSwitchだとウィンドウ一覧を表示してWindowsのAlt-Tab的な感覚で選べます。
これらをCmd-Tab、Cmd-`として登録してMacのデフォルト機能を上書きしておくとかなり快適。
上書きするのが嫌ならCmdの代わりにOptかCtrlに。
私自身はCmdの部分にCtrlを持ってきてるので HyperSwitchでCtrl-Tabに設定しています。 (キーボードの位置的にはCmd-Tab。)
WindowsではAutoHotkeyでCtrl-TabにAlt-Tabを割り当ててその逆もやってたりします。
発生する問題
たまに起こる問題として、Ctrl-Tabがたまにうんともすんとも言わなくなる、というもの。
アクティビティモニタをみても動いているし、HyperSwitchをアプリ一覧から実行してみると、立ち上がったというより普通に動いている状態で設定画面が出てくる、という感じ。
この状態でHypwerSwitchをアクティビティモニタから強制終了して(直接killする方法が無い…) 再度立ち上げてみても問題は解決しません。
アプリを再インストールとかしてもだめ。
唯一解決するのが一度Mac自体を再起動する、という方法でした。
アプリ自体の再起動でだめなのでアプリ自体がおかしくなった、というよりは他の何かと干渉してる感じです。
これまで一ヶ月に一度とか、ほんとにたまーに起こっているだけだったので、問題が起こったらしばらくトラックパッドでのウィンドウ切り替えで我慢して、期を見て再起動、とかしてました。
問題の原因
この問題の原因はSecure Inputという機能が他のアプリケーションによって有効になっていることでした。
Secure Inputという機能はパスワード入力の様な時に、アプリケーションがその入力を直接把握することを出来なくするようにする機能だそうです。
安全のための機能ですが、これがたまに必要がなくなった後にもアプリが有効にしたままにしていて 他の操作の妨げになってしまうことがあるようです。
上にもあるようにHyperSwitchだけでなくいろいろなアプリでこの機能が原因でトラブルが起こる模様。
解決法
もしHyperSwitchが動作しない、と気づいたら、ターミナルなどで、
$ ioreg -l -w 0 | grep SecureInput
| "IOConsoleUsers" = ({"kCGSSessionOnConsoleKey"=Yes,"kSCSecuritySessionID"=12345,"kCGSSessionSecureInputPID"=678,"kCGSSessionSystemSafeBoot"=No,"kCGSSessionIDKey"=789,"kCGSSessionUserNameKey"="user","kCGSessionLoginDoneKey"=Yes,"kCGSSessionGroupIDKey"=20,"kCGSessionLongUserNameKey"="user name","kCGSSessionAuditIDKey"=12345,"kCGSSessionLoginwindowSafeLogin"=No,"kCGSSessionUserIDKey"=501})
| "IOConsoleUsers" = ({"kCGSSessionOnConsoleKey"=Yes,"kSCSecuritySessionID"=12345,"kCGSSessionSecureInputPID"=678,"kCGSSessionSystemSafeBoot"=No,"kCGSSessionIDKey"=789,"kCGSSessionUserNameKey"="user","kCGSessionLoginDoneKey"=Yes,"kCGSSessionGroupIDKey"=20,"kCGSessionLongUserNameKey"="user name","kCGSSessionAuditIDKey"=12345,"kCGSSessionLoginwindowSafeLogin"=No,"kCGSSessionUserIDKey"=501})
というコマンドを打って見ると上の様に何かしら出てくるはずです。
この結果の中のkCGSSessionSecureInputPID"=678
とある部分の数字がこの部分のことを実行しているアプリのPIDなので、
$ ps -p 678
PID TTY TIME CMD
678 ?? 0:12.34 /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow console
の様にps
で何がこれを使っているか見てみます。
出てきたアプリケーションがすぐに落としても大丈夫なものであればそのアプリケーションを終了するか そのままPIDを
$ kill -kill 678
とかすると解決する時もあります。ただ、アプリによっては出てきたPIDをkillしても他のプロセスに引き継がれてうまく動作しないこともあるみたいです。
さらに、上の場合には
loginwindow console
ですが、これが出た場合は非常に厄介で、これはログイン画面で使われるプロセスで、
ログイン画面でのパスワード入力のためのSecure Inputが残っている状態です。
で、このプロセスをkillすると強制ログアウトされます。
なので普通に再起動するのと余り大差がない状態。
によると一旦画面ロックしてログイン画面に戻って再ログインすれば治る、ということもあるみたいですが、
私の環境で同じ様にloginwindow console
が問題だった場合にはうまくいきませんでした。
この場合には再起動するしかありません。
もう一つ面倒なプロセスとして VPNを利用するためのアプリ、GlobalProtectを起動して接続すると Secure Inputが使われ続ける、というもの。
Live Community - GlobalProtect VPN Client Mac OSX Secure Input - Live Community - 321721
これをkillすればもちろんVPNから出てしまうので、昨今の状況下でリモートワークも多い中、 GlobalProtectとかを使ってるところも多いかと思いますが、そんな状況下だとどうしようもない、といった所。
上のポストは最近の話で、なんとかしよう、といった雰囲気になっていますし、 恐らく最近良く使われてそういうケースも多くなって問題視されてより解決する方向へ力を入れてくれるんじゃないか、との期待も。
結構な確率でなるので、最初はVPN使う上で常時使う様にしてるのかな、と思ったりもしたんですが、 何度か使ってると接続中でもSecure Inputを使ってないこともあり、 どうやら一番最初にログインするためにパスワードを聞く所で有効にして、 その後上手く処理出来ないことがある模様。恐らくバグっぽい。
なので接続してすぐに試してみて、HyperSwitchが動作しない場合は上の様に調べてみて、 Global Protectが問題なら一度プロセスKillして再度接続してみる、 ということをしてみると問題なく動作することもあります。
まとめ
原因はMacのSecure Inputという機能だと言うことはわかりましたが、 逆に結構面倒な状態に陥ってることもある、ということもわかりました。
場合によっては再起動が必要です。
多分Secure Inputを掴み続けてるのはどれもバグ的なもので、 実際他のアプリでも問題が起こっていて、 修正される可能性はあるんだとは思いますが。
状況によっては仕方ないのでオリジナルのCmd-Tabとかを使って乗り切るしか無いのかな、面倒だけど。