mieki256's diary



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 って、今も使えるのだろうか…?

Windows用スクリーンセーバについて少し説明。 :

ウインドウハンドル云々については、ちょっと説明が必要かもしれない。

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 日分です。

過去ログ表示

Prev - 2022/08 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project