Clipoli 0.0.0

IronPython を Windows 7 から削除の予定。
言語としては素晴らしいのだがなにせ遅い、我慢するのはもう限界だ。
さて困った、こいつは自分で利用しているからなんとかしなければ。

NotifyIcon to use from IronPython

C# で作り変えするしか無い、いや C++ でも作れるけど何故かやりたくない。
WindowsForm を使うので同じなんだが .NET で作りたいので。

せっかく作り変えるのだし exe にまとめるのだし、もう少し拘りたい。

まずはアイコンを埋め込みしたい、これは Python じゃ無理だったので。
しかし Form は使わないので this.Icon からトレイ用のアイコンを取得できない。

Icon.ExtractAssociatedIcon メソッド (System.Drawing)

なんだ、exe からアッサリ取得できるみたい。
ということは自分自身の exe 名を指定だけでイケそうだ。
アイコンの指定は csc.exe への引数で埋め込みできるもんね。

どうでもいいかもしれないけど exe 名の名前空間に収めたいな。
exe 名は、minipoli 同様なミニアプリだから clipoli にしよう。

そう、Windows 用の新規アプリで公開してしまおうと、三年ぶりか。
Cinema とかのもう自分が使っていないアプリの公開を終了するか悩む所。

そうそう、バージョン情報ダイアログも追加しなきゃ。
これは SeeMe v4 の時に作ったのを持ってきて、って SeeMe v4 は WPF だ。
流用すると WindowsForm と混在になるので名前空間がややこしくなる…

しかたがない、 Form でテキトーに作ってみるか。

about.cs

using System;
using System.Windows;
using System.Windows.Forms;
using System.Drawing;

namespace Clipoli
{
	class About : Form
	{
		public About(Icon icon)
		{
			this.Text = "About Clipoli";
			this.Icon = icon;
			this.Width = 300;
			this.Height = 200;
			var label = new Label();
			label.Location = new Point(10, 10);
			label.Text = "情報";
			this.Controls.Add(label);
			var button = new Button();
			button.Location = new Point(10, 100);
			button.Text = ("OK");
			button.Click += on_ok;
			this.Controls.Add(button);
		}
		void on_ok(object sender, EventArgs e)
		{
			Close();
		}
	}
}

WindowsForm が嫌いだからといえ我ながらテキトーすぎる。
それはそれとしてメインソース。

mainsrc.cs

using System;
using System.IO;
using System.Windows;
using System.Windows.Forms;
using System.Drawing;

namespace Clipoli
{
	class TrayIcon
	{
		private NotifyIcon _icon;
		public TrayIcon()
		{
			var menu = new ContextMenu();
			menu.MenuItems.Add("メモ帳", on_notepad);
			menu.MenuItems.Add("クリップボード", on_clipboard);
			menu.MenuItems.Add("-");
			menu.MenuItems.Add("バージョン情報", on_about);
			menu.MenuItems.Add("-");
			menu.MenuItems.Add("終了", on_exit);
			// create tray icon
			_icon = new NotifyIcon();
			_icon.ContextMenu = menu;
			_icon.Icon = Icon.ExtractAssociatedIcon("clipoli.exe");
			_icon.Text = "Description Text";
			_icon.Visible = true;
		}
		private void on_notepad(object sender, EventArgs e)
		{
			System.Diagnostics.Process.Start("notepad.exe");
		}
		private void on_clipboard(object sender, EventArgs e)
		{
			try
			{
				Clipboard.SetText("あずにゃん");
				System.Media.SystemSounds.Beep.Play();
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
			}
		}
		private void on_about(object sender, EventArgs e)
		{
			var about = new About(_icon.Icon);
			about.ShowDialog();
		}
		private void on_exit(object sender, EventArgs e)
		{
			_icon.Visible = false;
			Application.Exit();
		}
	}
	class __main__
	{
		[STAThread]
		public static void Main(string[] args)
		{
			var n = new TrayIcon();
			Application.Run();
		}
	}
}

アイコンは IronPython 用に作ったのを仮で置いてビルドバッチ。
WindowsForm で .net 4.0 は馬鹿馬鹿しいので 3.5 の csc exe で。

build.bat

C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe ^
/reference:System.Windows.Forms.dll ^
/reference:System.Drawing.dll ^
/target:winexe ^
/out:clipoli.exe ^
/win32icon:icon.ico ^
/optimize+ ^
*.cs
PAUSE

まとめて ZIP
clipoli000.zip

まだテスト段階だしこんな感じでいいだろう。
動かしてみる、まあ IronPython 作の時とほぼ同じだし当然動くか。

問題はトレイアイコンの右クリックしか受け付けないことなんだよな。
自分で使うだけの分にはそれでいいのだが公開するとなると…

というか、ミニノートで作るのが少々辛くなってきた。
意地をはってもしかたがないし、もう少しマシな Windows を買おうかなと。