2022/08/02(火) [n年前の日記]
#1 [python][pygame] pygameでスクリーンセーバを作りたいのだけど
Python + pygame でWindows用のスクリーンセーバを作れないものかとググっていたら気になる話を見かけたのでメモ。2003年頃のやり取りらしい。
_[pygame] windows screen saver in pygame?
_IntegratingPyGame - wxPyWiki
環境変数 SDL_VIDEO_DRIVER と SDL_WINDOWID を設定することで、指定されたウインドウハンドルをSDLの描画領域として利用することができるかもしれない、とのことで。それが可能なら、Windows用のスクリーンセーバを作れるのかもしれないなと…。
ただ、今現在の pygame は SDL1.x から SDL2 になってるので、件の環境変数は反映されないかも、という話も見かけた。
_Using 'SDL_WINDOWID' does not embed pygame display correctly into another application - Issue #1574 - pygame/pygame
_"SDL_CreateWindowFrom" in "display" module by Rabbid76 - Pull Request #2981 - pygame/pygame
_class method "from_foreign_window" added to class "Window" by Rabbid76 - Pull Request #2982 - pygame/pygame
解決するためのパッチ(SDL_CreateWindowFrom()を利用するらしい)も投稿されてるけれど、マージされてるかはちょっと不明。
余談。Ruby/SDL も件の環境変数を使って、指定のウインドウハンドルで描画領域を用意できるっぽい。
_Ruby/SDL Reference Manual
ただ、Ruby/SDL って、今も使えるのだろうか…?
_[pygame] windows screen saver in pygame?
_IntegratingPyGame - wxPyWiki
環境変数 SDL_VIDEO_DRIVER と SDL_WINDOWID を設定することで、指定されたウインドウハンドルをSDLの描画領域として利用することができるかもしれない、とのことで。それが可能なら、Windows用のスクリーンセーバを作れるのかもしれないなと…。
ただ、今現在の pygame は SDL1.x から SDL2 になってるので、件の環境変数は反映されないかも、という話も見かけた。
_Using 'SDL_WINDOWID' does not embed pygame display correctly into another application - Issue #1574 - pygame/pygame
_"SDL_CreateWindowFrom" in "display" module by Rabbid76 - Pull Request #2981 - pygame/pygame
_class method "from_foreign_window" added to class "Window" by Rabbid76 - Pull Request #2982 - pygame/pygame
解決するためのパッチ(SDL_CreateWindowFrom()を利用するらしい)も投稿されてるけれど、マージされてるかはちょっと不明。
余談。Ruby/SDL も件の環境変数を使って、指定のウインドウハンドルで描画領域を用意できるっぽい。
_Ruby/SDL Reference Manual
ただ、Ruby/SDL って、今も使えるのだろうか…?
◎ Windows用スクリーンセーバについて少し説明。 :
ウインドウハンドル云々については、ちょっと説明が必要かもしれない。
Windows用のスクリーンセーバは、拡張子が .scr のファイルなのだけど。この .scr、実態は .exe の拡張子を変更しただけのファイル。3種類のコマンドラインオプション、/s、/c、/p xxxx のどれかしらを渡した際に動作が変わる .exe を作って、それを .scr にリネームすればWindows用のスクリーンセーバとして利用できる、ということになっている。
オプションの意味は以下。
/s か /c を指定した時の動作なら、おそらくはどんな言語でも、ある程度は実装できる。
問題は、/p xxxx を指定した場合。ウインドウハンドル xxxx に描画をしないといけないわけだけど、他から指定されたウインドウハンドルに対して描画ができる言語やフレームワークってそれほどなかったりするので、ちゃんとしたスクリーンセーバを作るなら C/C++ で書くしかないよね、という話になってしまう。まあ、C# の作例はあるし、HSP でも書けるのだけど…。 *1
そんなわけで、Python + pygame も与えられたウインドウハンドルで描画ウインドウを作れるなら、スクリーンセーバを作る際のハードルが随分と下がってくれそうだなと。
Windows用のスクリーンセーバは、拡張子が .scr のファイルなのだけど。この .scr、実態は .exe の拡張子を変更しただけのファイル。3種類のコマンドラインオプション、/s、/c、/p xxxx のどれかしらを渡した際に動作が変わる .exe を作って、それを .scr にリネームすればWindows用のスクリーンセーバとして利用できる、ということになっている。
オプションの意味は以下。
- /s : フルスクリーン表示。
- /c : 設定画面ダイアログを表示する。
- /p xxxx : プレビュー表示。xxxx は、Windowsのスクリーンセーバ選択画面のプレビュー窓のウインドウハンドル。
/s か /c を指定した時の動作なら、おそらくはどんな言語でも、ある程度は実装できる。
問題は、/p xxxx を指定した場合。ウインドウハンドル xxxx に描画をしないといけないわけだけど、他から指定されたウインドウハンドルに対して描画ができる言語やフレームワークってそれほどなかったりするので、ちゃんとしたスクリーンセーバを作るなら C/C++ で書くしかないよね、という話になってしまう。まあ、C# の作例はあるし、HSP でも書けるのだけど…。 *1
そんなわけで、Python + pygame も与えられたウインドウハンドルで描画ウインドウを作れるなら、スクリーンセーバを作る際のハードルが随分と下がってくれそうだなと。
*1: ただ、HSP で作ったスクリーンセーバは、起動時か終了時かタイミングが分からんけれど、Windowsのイベントログにエラーを残していくのだよな…。なんでだろ。
[ ツッコむ ]
以上、1 日分です。