2022/08/10(水) [n年前の日記]
#2 [python][windows] Windows用スクリーンセーバの呼び出し動作をPythonで確認
Windows用スクリーンセーバを、Python を使って作ってみたい。
環境は、Windows10 x64 21H2 + Python 3.8.10 x64。
まずは、Windows用スクリーンセーバが呼び出される時、どんなオプションが渡されているのかを念のために調べておきたい。そこで、渡されたオプションを、デスクトップ上のテキストファイルに追記していくだけの Pythonスクリプトを書いてみた。
_01_scrsavchk.py
このスクリプトファイルを、PyInstaller を使ってexe化する。
01_scrsavchk.exe を、01_scrsavchk.scr にリネーム。Windows用スクリーンセーバの実行ファイル、.scr の実体は、拡張子を .scr にリネームした .exeファイルなので…。
今回、Python 3.8.10 x64 (64bit版) でexe化したので…。
ということで、01_scrsavchk.scr を、C:\Windows\System32\ 以下にコピーした。
スクリーンセーバとして選んでみる。
スクリーンセーバ一覧の中に、01_scrsavchk という種類が増えている。これを選ぶと、DOS窓が開いて、2秒ほど経ったら閉じる。「設定」「プレビュー」ボタン等も押してみて様子を伺う。
デスクトップに、temp_log.txt というテキストファイルができているはず。中身を確認。
そんなわけで、巷の解説通り、Windows用スクリーンセーバは、以下の3種類のオプションを渡した状態で実行されることが分かった。
また、「設定」「プレビュー」ボタンを押して実行・終了した直後、すぐさま /p xxxxx を渡して実行されていることも分かった。
Windows用のスクリーンセーバは多重起動を禁止するように作るべしと言われているけど、このあたりの呼び出しタイミングがシビア、ということだろうか…。それとも、既にフルスクリーンで起動してるのに、再度実行されてしまう場面もあり得るのだろうか…。
環境は、Windows10 x64 21H2 + Python 3.8.10 x64。
まずは、Windows用スクリーンセーバが呼び出される時、どんなオプションが渡されているのかを念のために調べておきたい。そこで、渡されたオプションを、デスクトップ上のテキストファイルに追記していくだけの Pythonスクリプトを書いてみた。
_01_scrsavchk.py
import os import sys import datetime import time def main(): desktop_dir = os.path.expanduser('~/Desktop') log_file = os.path.join(desktop_dir, "temp.log.txt") dt_now = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S") print("Screensaver option check") print("%s" % dt_now) print("look %s" % log_file) kind = "none" hwnd = 0 if len(sys.argv) >= 2: s = sys.argv[1][0:2].lower() if s == "/s": # full screen kind = "fullscreen" elif s == "/c": # config / settings kind = "config" elif s == "/p": # preview kind = "preview" hwnd = int(sys.argv[2]) with open(log_file, 'a') as f: f.write("[%s] %s , [%s]\n" % (dt_now, kind, " ".join(sys.argv))) time.sleep(2) if __name__ == '__main__': main()
このスクリプトファイルを、PyInstaller を使ってexe化する。
pyinstaller --onefile --noupx 01_scrsavchk.pydistディレクトリに、01_scrsavchk.exe というexeファイルが作られた。
01_scrsavchk.exe を、01_scrsavchk.scr にリネーム。Windows用スクリーンセーバの実行ファイル、.scr の実体は、拡張子を .scr にリネームした .exeファイルなので…。
今回、Python 3.8.10 x64 (64bit版) でexe化したので…。
- 64bit版のプログラム → C:\Windows\System32\ 以下に入れる。
- 32bit版のプログラム → C:\Windows\SysWOW64\ 以下に入れる。
ということで、01_scrsavchk.scr を、C:\Windows\System32\ 以下にコピーした。
スクリーンセーバとして選んでみる。
- Windows10の左下の検索欄に「スクリーンセーバー」と打ち込んで、リストアップされた「スクリーンセーバーの変更」を起動。
- もしくは、デスクトップを右クリック → 個人用設定 → ロック画面 → スクリーンセーバー設定、でもいい。
スクリーンセーバ一覧の中に、01_scrsavchk という種類が増えている。これを選ぶと、DOS窓が開いて、2秒ほど経ったら閉じる。「設定」「プレビュー」ボタン等も押してみて様子を伺う。
デスクトップに、temp_log.txt というテキストファイルができているはず。中身を確認。
[2022/08/10 19:51:13] preview , [C:\WINDOWS\system32\01_scrsavchk.scr /p 68114] [2022/08/10 19:51:21] config , [C:\WINDOWS\system32\01_scrsavchk.scr /c:330168] [2022/08/10 19:51:24] preview , [C:\WINDOWS\system32\01_scrsavchk.scr /p 68114] [2022/08/10 19:51:29] fullscreen , [C:\WINDOWS\system32\01_scrsavchk.scr /s] [2022/08/10 19:51:32] preview , [C:\WINDOWS\system32\01_scrsavchk.scr /p 68114] [2022/08/10 19:51:41] preview , [C:\WINDOWS\system32\01_scrsavchk.scr /p 68114]これで、Windows10 がどんなオプションをつけてスクリーンセーバを呼び出しているのかが分かる。
そんなわけで、巷の解説通り、Windows用スクリーンセーバは、以下の3種類のオプションを渡した状態で実行されることが分かった。
- /s : フルスクリーン表示。
- /c:xxxxx : 設定画面表示。
- /p xxxxx : スクリーンセーバー設定画面内のプレビュー表示。xxxxx はウインドウハンドル。
また、「設定」「プレビュー」ボタンを押して実行・終了した直後、すぐさま /p xxxxx を渡して実行されていることも分かった。
Windows用のスクリーンセーバは多重起動を禁止するように作るべしと言われているけど、このあたりの呼び出しタイミングがシビア、ということだろうか…。それとも、既にフルスクリーンで起動してるのに、再度実行されてしまう場面もあり得るのだろうか…。
[ ツッコむ ]
以上です。