
Stream Deck で Mac をロックする
前回の続きです。
私は現在フルリモートで働いていますが、自宅とはいえ短時間でも離席するならちゃんと端末はロックせねばなりません。
ということでボタン一つで Mac をロックする、そんなボタンを作ることにしました。
Apple Script を使ってスクリプトからロックする方法としては、ロック用のショートカットキーのコンビネーション(Ctrl + Cmd + Q)を代わりに送信させるのが定番らしいです。

Apple Script を書いてみる
Apple Script は、Mac にはじめからインストールされているエディタ、その名も スクリプトエディタ.app を使って行います。
Note
実際には他のエディタでも書くことはできるんですけど、スクリプトエディタを使えばそのまま実行してお試しできるので便利ですよってだけの話です。
むしろ IntelliJ のような高級 IDE とか VSCode のような高機能エディタに慣れてしまっていると、かなり使いにくいというか、癖のあるエディタだな、ってのが個人的な感想です 😰
Mac をロックする Apple Script
ということで、ロックする Apple Script はこんな感じです。
tell application "System Events"
keystroke "q" using {control down, command down}
end tell
System Events に対して、ctrl と cmd を押しながら、q キーを送信するって感じですね。
超シンプル。
実際にスクリプトエディタの実行ボタン(再生ボタンみたいな横向き三角ボタン)を押すと、すぐに画面がロック…されません。
多分、初回は
Error
System Eventsでエラーが起きました: スクリプトエディタにはキー操作の送信は許可されません。
って言われて動かないはず。
これは、Mac がセキュリティ上の理由から、許可してないアプリからのキーコードの送信ができないようになっているためです。
(なので、多分これが出なかった方は既に似たようなことをやってるとかでエディタを許可リストに入れてる可能性が高いです)
ということで、「システム設定(システム環境設定)」→「プライバシーとセキュリティ」→「アクセシビリティ」と進んで表示されたリストから
「スクリプトエディタ」を探して横のスイッチを ON にします。
一度実行してエラーになると、許可待ち状態みたいな感じで、スイッチが OFF の状態でリストにすでにいると思うので、それをクリックするだけで OK なはずですが、ない場合は、「+」ボタンからスクリプトエディタ.appを追加してあげます。
これでもう一度実行してロックされればスクリプトの準備は OK。
あとは適当な名前をつけて、どこか適当な場所に保存しておきます。自分は ~/Labo/AppleScripts にいれました。
保存形式は、スクリプト(.scpt)またはテキスト(.applescript)の場合は関連付けたエディタ(スクリプトエディタ)で開く代わりに osascript コマンドを使って実行してくれるみたいなので、このいずれかにするのが良さそうです。
一応、アプリケーション(.app)でも実行ファイルなので当然そのまま起動してくれるのですが、実行中は Dock にアイコンが出てきちゃいます。
そして唯一だめだったのがスクリプトバンドル(.scptd)で、この形式のときだけは実行されずにスクリプトエディタで開いてしまいました。
| 形式 | 拡張子 | 結果 |
|---|---|---|
| スクリプト | .scpt | osascript で実行される |
| スクリプトバンドル | .scptd | スクリプトエディタで開かれ実行されない |
| アプリケーション | .app | アプリとして実行される |
| テキスト | .applescript | osascript で実行される |
Stream Deck から実行させる
Stream Deck の「システム」→「開く」アクションは、ファイルやフォルダ、アプリだけじゃなくて、スクリプト自体も登録して実行できます。
なので、「開く」アクションを追加して、 App/ファイル の欄に今作ったスクリプトを登録します。
あとは、これで登録したキーを押せば即座に Mac をロックできるようになります。
Auto Exit と組み合わせたい
- アクションをフォルダ内に登録している
- Auto Exit を使って、実行後はフォルダを閉じる
みたいにしてる場合、画面をロックした時点で Stream Deck 本体と、Mac 上の Stream Deck アプリの通信も切れるために
Auto Exit の途中で止まってしまって、フリーズしたように見えてしまいます。
もちろんロックされるとすぐに接続がきれて接続待機状態になるのでそんな気にするようなレベルでもないんですが…
私はなんかちょっと気になってしまったので、Auto Exit でフォルダが閉じるまでまってからキーコードを送るように調整してみることにしました。
で、待機させる方法としては2種類考えられます。
- Apple Script を修正してディレイを入れる
- マルチアクションを使って Stream Deck 側でディレイを入れる
Apple Script を修正してディレイを入れる
Auto Exit までの待ち時間があるならその分キーコードを送るのを遅らせればいいじゃない、という考え方です。
tell application "System Events"
delay 1.5
keystroke "q" using {control down, command down}
end tell
delay は他の言語でもよく見かける、一定時間処理を遅らせる命令です。
単位はプログラミング言語としては珍しく 秒 です。(こういうのってミリ秒なコト多いんですけどね)
なので、たとえば、 Auto Exit までの待機時間を 1 秒にしてるならば、 delay は 1.5 とするみたいな感じで、うまくタイミングを調整してあげることでいい感じに連携できてる感がでました。
(どのくらいのディレイがいいかは、人によっても感じ方とかあると思うのでそのへんはよしなに調整してもらうのがよさそうです)
マルチアクションを使って Stream Deck 側でディレイを入れる
Stream Deck にはマルチアクションという、1つのキー押下で複数のアクションを実行させる仕組みがあります。
これを使って、押されたらまずしばらく待機して、それから「開く」を実行させるようにすることでも同様に実行を遅延させることができます。

こんな感じで、マルチアクションの1つ目に「マルチアクション」→「遅延」をセットし、待機させる時間を入力します。
今回は単位は「ミリ秒」なので、先程と同じく 1.5 秒待つならば 1500 と入力します。
で、その下に先程と同様に「システム」→「開く」をセットしてロックするためのスクリプトをセットしてあげれば、Stream Deck 側で待機時間を制御できるようになります。
どっちの方法が良いのか?
どちらでもやりたいことは実現できそうですが、Stream Deck から使うのであれば、後者のマルチアクションを使った方法のほうがおすすめです。
理由としては、ディレイを入れたい理由が「Auto Exit」由来だからです。
スクリプトはあくまで Mac をロックすることだけに特化させ、待機処理は Stream Deck 側で制御することで、
- 役割を分けることができる
- Auto Exit の待機時間を変えたくなったときは、スクリプト実行のディレイも変更する必要が出てくるが、両方とも Stream Deck のアプリで完結できる
- Auto Exit に依存している待機時間の実装をスクリプトから排除することで、ロックスクリプトを他の場所でも流用しやすくなる(たとえば他のアプリやツールから呼ぶとか、あるいは別の、Auto Exit をつけてない階層にもボタンを置きたくなったときとか)
といったメリットがあります