Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Why "stay awake" APIs don't keep you green on Teams

2026年11月03日に「Dev.to」が公開したITニュース「Why "stay awake" APIs don't keep you green on Teams」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Teamsが「退席中」になるのは、PCのスリープ防止ツールでは解決しない。OSのアイドル状態には「電源管理」と「入力」の2種あり、Teamsは後者を見るためだ。そこで、アプリに影響を与えず擬似的な入力イベントで「入力アイドル」をリセットし、短時間の離席時にTeamsが「退席中」になるのを防ぐ方法が紹介されている。

ITニュース解説

多くの人がMicrosoft Teamsなどのコミュニケーションツールを使っている環境で、PCから少し席を離れただけでステータスが「離席中(Away)」に変わってしまうことに不満を感じているかもしれない。トイレやコーヒーを取りに行くだけの短い時間でも、PCに戻るとすでに離席中表示になっており、すぐに戻ってきたにも関わらず、他の人には長時間席を外していたように見えてしまうことがある。この問題を解決しようと、「PCをスリープさせない」といった一般的なツールを使っても、Teamsのステータスはやはり「離席中」になってしまう。この現象はなぜ起こるのか、そしてどのように解決できるのかを詳しく見ていこう。

この問題の根源は、オペレーティングシステム(OS)が持つ「アイドル状態」という概念が、実は二つの異なる側面を持っていることにある。 一つ目は「パワーマネジメントアイドル」と呼ばれるものだ。これは、ディスプレイを暗くしたり、スクリーンセーバーを起動したり、最終的にPCをスリープ状態に移行させたりするための判断基準となる。PCの電源管理機能と密接に関連しており、アプリケーションはOSに対して「今はアクティブであるべきだ」と主張することで、これらのスリープ移行動作を抑制できる。例えば、macOSではIOPMAssertionCreateWithNameのような機能、WindowsではSetThreadExecutionStateという機能を使うことで、PCやディスプレイを意図的にアクティブな状態に保つことが可能だ。多くの「PCをスリープさせない」と謳うツール(MacのcaffeinateやAmphetamine、WindowsのPowerToys Awakeなど)は、このパワーマネジメントアイドルに働きかけることで、長時間ダウンロード中のPCがスリープしたり、プレゼンテーション中に画面が消えたりするのを防いでいる。

しかし、Teamsの「離席中」判断に影響するのは、もう一つの「入力アイドルタイム」という概念である。これは、マウスの動き、キーボードの入力、トラックパッドの操作といった入力イベントが最後に発生してから、どれくらいの時間が経過したかを単純にカウントするカウンターだ。OSは常にこのカウンターを保持しており、どのアプリケーションもこのカウンターの値を読み取ることができる。Teamsは、この入力アイドルタイムが約5分を超えると、ユーザーがPCから離れたと判断し、ステータスを「離席中」に切り替えるのだ。

ここで重要なのは、前述のパワーマネジメントアイドルを制御するツールが、この入力アイドルタイムのカウンターには一切影響を与えないという点だ。つまり、PCをスリープさせないようにしていても、マウスやキーボードの操作がなければ入力アイドルタイムは増え続け、Teamsはユーザーが席を離れたと判断してしまうのである。筆者はこの点を実際に検証し、パワーマネジメント用のOS機能が入力アイドルタイムのカウンターをリセットしないことを確認している。

この問題を解決するために、これまでに試されてきた一般的な方法にも課題があった。 「マウスジグラー」と呼ばれるツールは、カーソルをわずかに動かすことで、入力イベントを発生させてカウンターをリセットする。しかし、これは実際にカーソルが動くため、意図しないメニューが開いたり、ポップアップが表示されたりする可能性がある。また、ユーザーがPCに戻ってきて操作しようとした際に、カーソルがツールによって動かされていると、操作が妨げられるといった問題も発生する。 「F15キー」や「Shiftキー」のような実在するキーを押す方法も、入力カウンターをリセットするが、F15キーは一部のアプリケーションで何らかの機能に割り当てられている可能性があり、Shiftキーのような修飾キーは、次にクリックする際に「Shift+クリック」として認識されてしまうなど、意図しない動作を引き起こす危険性がある。

筆者が求めたのは、「他のアプリケーションに一切影響を与えず、入力アイドルタイムのカウンターだけをリセットできる入力イベント」を生成する方法だった。そして、この理想を実現する二つのOS固有の方法を発見し、「KeepMeOn」という小さなアプリケーションを開発した。

macOSでは、「修飾キーの状態が変化しないイベント」を利用する方法が考案された。macOSには、修飾キー(Shift, Control, Option, Command, Caps Lockなど)の状態が変化したときに発生するflagsChangedというイベントタイプがある。筆者は、このflagsChangedイベントを、現在の修飾キーの状態と全く同じ状態で生成し、OSに送信した。これにより、OSは入力イベントがあったと認識し、入力アイドルタイムのカウンターはリセットされる。しかし、実際にはどのキーも押されたり離されたりしたわけではないため、どのアプリケーションもこのイベントに反応せず、ユーザーの操作を妨げることはない。この機能を使用するには、macOSのアクセシビリティ権限が必要となる。また、ユーザーが実際に修飾キーを押している間はイベントを生成しないようにし、誤動作を防ぐ工夫もされている。さらに、このイベントには独自のタグを付与することで、他のイベントと区別できるようにしている。

Windowsでは、さらに巧妙な方法が用いられた。Windowsには、どの機能にも割り当てられていない「仮想キーコード」の範囲(0x97から0x9F)が存在する。筆者は、この割り当てられていない仮想キーの一つについて、「キーを離した」というイベント(キーアップイベント)をOSに送信した。OSはこのイベントを入力と認識し、入力アイドルタイムのカウンターはリセットされる。しかし、存在しないキーのキーアップイベントであるため、どのアプリケーションもこれに反応することはなく、ユーザーの操作に影響を与えることはない。この方法では、特別な権限も不要である。ただし、管理者権限で実行されているアプリケーションが最前面にある場合、セキュリティ機能によってこの擬似的な入力イベントがブロックされる可能性があるという制限がある。

KeepMeOnアプリは、単に入力イベントを常に生成し続けるのではなく、賢い動作ルールを持っている。席を離れていないのに「離席中」になるのを防ぐのが目的であり、ユーザーが本当に長時間席を離れていることを隠すためのツールではないからだ。 具体的には、実際の入力が2分間ない場合にのみ動作を開始する。そして、その後は60秒ごとにチェックを行い、必要であれば擬似的な入力イベントを生成してカウンターをリセットする。これにより、入力アイドルタイムのカウンターはTeamsが「離席中」と判断する5分よりも常に短い時間(最大約3分)に保たれる。 また、画面がロックされている時や、PCまたはディスプレイがスリープしている時は、KeepMeOnは自動的に動作を一時停止する。これは、ユーザーがPCから離れる際に画面をロックすることが一般的であり、その際にはTeamsにも正しく「離席中」と表示されるべきだという思想に基づいている。さらに、オプションで勤務時間外や昼休み中に動作を停止する設定も可能だ。 KeepMeOnは無料のオープンソースソフトウェアとして提供されており、macOS版とWindows版が利用できる。余計な依存関係やアカウント登録、分析機能などは一切なく、更新チェック以外で外部と通信することもない。

このKeepMeOnアプリの開発は、OSの内部的な挙動、特に「アイドル状態」という概念の深い理解がなければ実現できなかった解決策である。単に表面的な問題を解決するだけでなく、OSが持つ複数の層の機能を見極め、それぞれの特性を巧みに利用することで、ユーザーのニーズに合致するスマートなソリューションが生まれた事例と言えるだろう。企業の管理下にあるPCで利用する場合は、このようなツールの使用が許可されているかを確認することが重要だ。

関連コンテンツ

関連IT用語

関連ITニュース