0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

p5.js との組み合わせ:スリープ・ロックなどを防止するブラウザの「Screen Wake Lock API」を試す【p5.js:3】

Last updated at Posted at 2025-11-24

(この記事は p5.js の Advent Calendar 2025 の記事【3つ目】にする予定です)

はじめに

この記事は、以下の MDN・Chrome Platform Status でも記載されているブラウザの「Screen Wake Lock API」に関する記事です。

●画面起動ロック API - Web API | MDN
 https://developer.mozilla.org/ja/docs/Web/API/Screen_Wake_Lock_API

●Screen Wake Lock API - Chrome Platform Status
 https://chromestatus.com/feature/4636879949398016

Screen Wake Lock API について

この API は、PC で「画面の消灯、スリープ、ロック」が実行されるのを防止できるものです。自分の場合は、展示イベントで有効活用できそうです(あと、ストップウオッチ・タイマー系のアプリとの組み合わせなど、他でも活用できそうです)。

Screen Wake Lock API に関する補足

この API を有効にする際には、ユーザー操作が行われた後である必要があることに注意が必要です(ページを開いた後、自動で勝手に有効化することはできません)。

それと、MDN の記載によると「例えば、システム設定(省電力モードやバッテリー残量が少ない場合など)、文書がアクティブでない、または表示されていない場合、リクエストが拒否されることがある」ということもあるようです。

簡単なお試し

それでは、お試しをやってみます。

お試し用のコード

以下は、今回用に用意したコードです。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <script src="https://cdn.jsdelivr.net/npm/p5@1.11.11/lib/p5.js"></script>
    <meta charset="utf-8" />
  </head>
  <body>
    <main></main>
    <script>
      let wakeLock = null;
      let statusText = "未使用";

      async function requestWakeLock() {
        if (!("wakeLock" in navigator)) {
          statusText = "非対応";
          return;
        }

        try {
          wakeLock = await navigator.wakeLock.request("screen");
          statusText = "ロック中";

          wakeLock.addEventListener("release", () => {
            wakeLock = null;
            statusText = "解除済";
          });
        } catch (err) {
          statusText = "エラー";
        }
      }

      async function releaseWakeLock() {
        if (!wakeLock) return;

        try {
          await wakeLock.release();
          wakeLock = null;
          statusText = "解除済";
        } catch (err) {
          statusText = "エラー";
        }
      }

      function setup() {
        createCanvas(400, 200);
        textSize(16);
      }

      function draw() {
        background(240);

        textAlign(CENTER, CENTER);
        text("Lキー: ロック開始 / Uキー: ロック解除", width / 2, height / 2);

        textAlign(RIGHT, TOP);
        textSize(12);
        text(statusText, width - 10, 10);
      }

      function keyPressed() {
        if (key === "l" || key === "L") {
          requestWakeLock();
        } else if (key === "u" || key === "U") {
          releaseWakeLock();
        }
      }
    </script>
  </body>
</html>

上記のページを開き、ページにフォーカスがあたった状態で「L」キーを押すと、スリープ・ロック等を防止する状態になります(また「U」キーで、それを手動解除できるようにしています)。

解除される条件

なお、スリープ・ロック等を防止する状態にしたタブが裏に回ったりした場合や、ブラウザを最小化した場合などは、自動解除されるようです。スマホの場合は、別アプリへの切り替えやホーム画面に戻ったりした場合も自動解除となるようです。

これについて、スリープ・ロックを防止した状態を維持するには、復帰時に再取得が必要になるようです。例えば、タブが裏に回ったりした場合など(ページが不可視の状態になって戻った場合)に再取得をするには、visibilitychangeイベントと組み合わせて対応すると良いようです

2025-11-24_22-01-16.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?