今週のお題「懐かしいもの」
スクリーンセーバーを作成しました
スクリーンセーバーとは
ChatGPTより
コンピュータのディスプレイの焼き付き(画面に表示内容が長時間固定されることによって生じる残像)を防ぐために、一定時間操作が行われなかったときに自動的に表示されるプログラムのことです
しかし、現代のディスプレイは性能が向上し、焼き付きが起こらなくなったため
スクリーンセーバーが利用されることはなくなりました
今や懐かしの技術、です
経緯
ある日Qiitaのトレンドに乗っていたこちらの記事
スクリーンセーバーはwindows formアプリで簡単に作れるそうです
という訳で冒頭のスクリーンセーバーを作成しました
環境
- windows 11
- visual studio 2022
- .NET 6
- C#
機能概要
- windows formアプリ
- 全画面表示
- マウス非表示
- ロゴ画像アニメーション
- マウス入力で終了
- キー押下で終了
- サブモニタにも適当なフォーム表示
- 多重起動防止
実装
ChatGPT 3.5でコード生成し
Google検索で機能を探し
ツギハギで動かしました
Program.cs
namespace SumisoScreenSaver
{
internal static class Program
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
//Mutex名を決める
string mutexName = "sumiso craft ScreenSaver";
//Mutexオブジェクトを作成する
bool createdNew;
System.Threading.Mutex mutex =
new System.Threading.Mutex(true, mutexName, out createdNew);
//ミューテックスの初期所有権が付与されたか調べる
if (createdNew == false)
{
//されなかった場合は、すでに起動していると判断して終了
mutex.Close();
return;
}
try
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
finally
{
//ミューテックスを解放する
mutex.ReleaseMutex();
mutex.Close();
}
}
}
}
プログラムのエントリポイント
ほぼ
のコピペです
Form1.cs
namespace SumisoScreenSaver
{
public partial class Form1 : Form
{
private Image image = Resource1.design_01;
private Point position;
private Point speed;
private int imageWidth = 0;
private int imageHeight = 0;
private Point lastMousePosition = new Point();
public Form1()
{
InitializeComponent();
InitializeAnimation();
}
private void InitializeAnimation()
{
this.DoubleBuffered = true; // フリッカーを防ぐための設定
this.FormBorderStyle = FormBorderStyle.None; // フォームの枠を消す
this.WindowState = FormWindowState.Maximized; // フォームを最大化
this.TopMost = true; // 常に最前面に表示
Cursor.Hide();
// 画像表示サイズ
var scale = 1.5;
imageHeight = (int)(image.Height / scale);
imageWidth = (int)(image.Width / scale);
// 初期位置と速度を設定
Random rand = new Random();
position = new Point(rand.Next(this.Width - imageWidth), rand.Next(this.Height - imageHeight));
speed = new Point(rand.Next(2, 4), rand.Next(2, 4));
// タイマーの設定
timer1.Interval = 30; // タイマーの間隔を設定(ミリ秒)
timer1.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
this.Invalidate(); // フォームの再描画を要求
}
private void MoveImage()
{
// 画像の位置を更新
position.X += speed.X;
position.Y += speed.Y;
// 壁に当たった時の反射
if (position.X <= 0 || position.X + imageWidth >= this.Width)
{
speed.X = -speed.X;
}
if (position.Y <= 0 || position.Y + imageHeight >= this.Height)
{
speed.Y = -speed.Y;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
MoveImage();
e.Graphics.DrawImage(image, position.X, position.Y, imageWidth, imageHeight);
}
// キーボード入力で画面復帰
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
this.Close();
}
// マウス移動で画面復帰
private void MainForm_MouseMove(object sender, MouseEventArgs e)
{
if (lastMousePosition.IsEmpty)
{
lastMousePosition = e.Location;
return;
}
if (Math.Abs(e.X - lastMousePosition.X) > 5 || Math.Abs(e.Y - lastMousePosition.Y) > 5)
{
this.Close();
}
}
private void Form1_Load(object sender, EventArgs e)
{
var screen = Screen.AllScreens;
for (int i = 1; i < screen.Length; i++)
{
var subForm = new Form2();
subForm.StartPosition = FormStartPosition.Manual;
subForm.Location = screen[i].Bounds.Location;
subForm.Show();
}
}
}
}
Resource1.design_01
はsumiso craftのロゴで
背景透過のpng画像です
メソッド名はデフォルトの連番のままです
イベントハンドラの登録および
背景色はデザイナー側で設定しました
ChatGPTが生成したアニメーションのコードに
windowsのスクリーンセーバーを作る #C# - Qiita
の復帰処理を足し
マルチディスプレイ対応を追加しました
メイン以外のモニターにはForm2
を表示します
Form2.cs
namespace SumisoScreenSaver
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
this.DoubleBuffered = true; // フリッカーを防ぐための設定
this.FormBorderStyle = FormBorderStyle.None; // フォームの枠を消す
this.WindowState = FormWindowState.Maximized; // フォームを最大化
this.TopMost = true; // 常に最前面に表示
}
}
}
背景色はデザイナーで設定
表示座標を指定されたら、その場で最大化します
インストール
発行したexeファイルの拡張子をscr
に書き換えると
スクリーンセーバーとして認識されます
右クリックのメニューよりインストール
を選択
無い時はその他オプション
を探してください
スクリーンセーバーとして設定します
設定時間画面を操作せずにいると
スクリーンセーバーが起動します
おわりに
懐かしいというか、見なくなったスクリーンセーバー
実は単純なformアプリでした
需要があったら配布するかもしれません