cscの作法 その449

# 概要
cscの作法、調べてみた。
プログラムランチャー見つけたのでやってみた。

# 参考にしたページ

https://obataka.com/my-launcher-code/


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/442de468-3b38-337b-202d-6496646f055a.png)

# サンプルコード

```



using System;
using System.Collections.Generic;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using System.Runtime.InteropServices;


public class MyButton: Button {
	public MyButton(Int32 x, Int32 y, String caption, EventHandler eventMethod) {
		setConfig(x, y, caption, eventMethod, null, true);
	}
	public MyButton(Int32 x, Int32 y, String caption, EventHandler eventMethod, bool isMinimized) {
		setConfig(x, y, caption, eventMethod, null, isMinimized);
	}
	public MyButton(Int32 x, Int32 y, String caption, EventHandler eventMethod, String iconPath) {
		setConfig(x, y, caption, eventMethod, iconPath, true);
	}
	public MyButton(Int32 x, Int32 y, String caption, EventHandler eventMethod, String iconPath, bool isMinimized) {
		setConfig(x, y, caption, eventMethod, iconPath, isMinimized);
	}
	private void setConfig(Int32 x, Int32 y, String caption, EventHandler eventMethod, String iconPath, bool isMinimized) {
		Int32 xPoint = ((x - 1) * (Utils.buttonWidth - 1)) - (x - 1);
		Int32 yPoint = ((y - 1) * (Utils.buttonHeight - 1)) - (y - 1);
		this.Location = new Point(xPoint, yPoint);
		this.Size = Utils.getButtonSize();
		this.Click += eventMethod;
		if (isMinimized)
		{
			this.Click += delegate(object sender, EventArgs e) {
				new MyLauncher().Show(Utils.currentForm);
				Utils.currentForm.WindowState = FormWindowState.Minimized;
			};
		}
		if (caption != null)
		{
			this.Text = caption;
		}
		if (iconPath != null)
		{
			this.Image = System.Drawing.Icon.ExtractAssociatedIcon(iconPath).ToBitmap();
		}
	}
}

public class BaseForm: Form {
	public Button goTopButton;
	public BaseForm() {
		Text = "My Launcher";
		StartPosition = FormStartPosition.Manual;
		Location = Utils.getStartPosition();
		ClientSize = Utils.getFormSize();
		this.TopMost = true;
		this.Load += delegate(object sender, System.EventArgs e) {
			Utils.currentForm = this;
			Utils.unRegistHotKey();
			Utils.handle = this.Handle;
			Utils.registHotKey();
		};
		this.Closed += delegate(object sender2, System.EventArgs e2) {
			Utils.unRegistHotKey();
			Application.Exit();
		};
		Controls.Add(Utils.getAppearDesktopFolderButton());
		Controls.Add(Utils.getAppearDesktopButton());
		goTopButton = Utils.getGoTopButton(this);
		Controls.Add(goTopButton);
		Utils.setIcon(this);
	}
	public void Show(BaseForm f) {
		this.Show();
		f.Hide();
	}
	public void removeGoTop() {
		Controls.Remove(goTopButton);
	}
	protected override void WndProc(ref Message m) {
		base.WndProc(ref m);
		if (m.Msg == Utils.WM_HOTKEY)
		{
			if ((int)m.WParam == Utils.HOTKEY_ID)
			{
				if (this.WindowState == FormWindowState.Minimized)
				{
					this.WindowState = FormWindowState.Normal;
				}
				else
				{
					this.WindowState = FormWindowState.Minimized;
				}
			}
		}
	}
}

public class WaitingForm: Form {
	public WaitingForm() {
		Text = "起動中・・・・・";
		StartPosition = FormStartPosition.CenterScreen;
		ClientSize = new Size(200, 100);
		Label label = new Label();
		label.Text = "起動中・・・";
		label.AutoSize = true;
		label.Location = new Point(0, 40);
		Controls.Add(label);
	}
}

class Utils {
	public static IntPtr handle;
	public static BaseForm currentForm;
	public const int MOD_ALT = 0x0001;
	public const int MOD_CONTROL = 0x0002;
	public const int MOD_SHIFT = 0x0004;
	public const int WM_HOTKEY = 0x0312;
	public const int HOTKEY_ID = 0x0001;
	public const int HOTKEY2_ID = 0x0002;
	[DllImport("user32.dll")]
	static extern int RegisterHotKey(IntPtr HWnd, int ID, int MOD_KEY, int KEY);
	[DllImport("user32.dll")]
	static extern int UnregisterHotKey(IntPtr HWnd, int ID);
	[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
	static extern void SHGetStockIconInfo(UInt32 siid, UInt32 uFlags, ref SHSTOCKICONINFO sii);
	[DllImport("mpr.dll", EntryPoint = "WNetCancelConnection2", CharSet = CharSet.Unicode)]
	static extern int WNetCancelConnection2(string lpName, Int32 dwFlags, bool fForce);
	[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2", CharSet = CharSet.Unicode)]
	static extern int WNetAddConnection2(ref NETRESOURCE lpNetResource, string lpPassword, string lpUsername, Int32 dwFlags);
	[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
	struct SHSTOCKICONINFO {
		public Int32 cbSize;
		public IntPtr hIcon;
		public Int32 iSysImageIndex;
		public Int32 iIcon;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
		public string szPath;
	}
	[StructLayout(LayoutKind.Sequential)]
	internal struct NETRESOURCE {
		public int dwScope;
		public int dwType;
		public int dwDisplayType;
		public int dwUsage;
		[MarshalAs(UnmanagedType.LPWStr)]
		public string lpLocalName;
		[MarshalAs(UnmanagedType.LPWStr)]
		public string lpRemoteName;
		[MarshalAs(UnmanagedType.LPWStr)]
		public string lpComment;
		[MarshalAs(UnmanagedType.LPWStr)]
		public string lpProvider;
	}
	public const UInt32 SHGSI_ICON = 0x000000100;
	public const UInt32 SHGSI_SMALLICON = 0x000000001;
	public const UInt32 SIID_SHIELD = 0x00000004D;
	public const Int32 buttonWidth = 100;
	public const Int32 buttonHeight = 50;
	public const Int32 appearDeskTopButtonPosX = 5;
	public const Int32 appearDeskTopButtonPosY = 3;
	public const Int32 appearDeskTopButtonFolderPosX = 4;
	public const Int32 appearDeskTopButtonFolderPosY = 3;
	public const Int32 goTopPosX = 3;
	public const Int32 goTopPosY = 3;
	public static Size getButtonSize() {
		return new Size(buttonWidth, buttonHeight);
	}
	public static Size getFormSize() {
		return new Size(493, 146);
	}
	public static Point getStartPosition() {
		return new Point(77, 0);
	}
	public static Button getAppearDesktopButton() {
		return getAppearDesktopButton(appearDeskTopButtonPosX, appearDeskTopButtonPosY);
	}
	public static Button getAppearDesktopButton(Int32 x, Int32 y) {
		return new MyButton(x, y, "デスクトップの表示", delegate(object sender, System.EventArgs e) {
			System.Diagnostics.Process.Start("exploer.exe", "shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}");
		});
	}
	public static Button getAppearDesktopFolderButton() {
		return getAppearDesktopFolderButton(appearDeskTopButtonFolderPosX, appearDeskTopButtonFolderPosY);
	}
	public static Button getAppearDesktopFolderButton(Int32 x, Int32 y) {
		return new MyButton(x, y, "デスクトップ\nフォルダ", delegate(object sender, System.EventArgs e) {
			System.Diagnostics.Process.Start("exploer.exe", @"C:\Users\User\Desktop");
		});
	}
	public static Button getGoTopButton(BaseForm form) {
		return getGoTopButton(goTopPosX, goTopPosY, form);
	}
	public static Button getGoTopButton(Int32 x, Int32 y, BaseForm form) {
		return new MyButton(x, y, "トップへ戻る", delegate(object sender, System.EventArgs e) {
			new MyLauncher().Show(form);
		}, false);
	}
	public static void connectNwDir(String dir) {
		try
		{
			System.Diagnostics.Process.Start(dir);
		}
		catch (Exception)
		{
			NETRESOURCE netResource = new NETRESOURCE();
			netResource.dwScope = 0;
			netResource.dwType = 1;
			netResource.dwDisplayType = 0;
			netResource.dwUsage = 0;
			netResource.lpLocalName = "";
			netResource.lpRemoteName = dir;
			netResource.lpProvider = "";
			string password = "pass";
			string userId = "id";
			try
			{
				WNetCancelConnection2(dir, 0 , true);
				WNetAddConnection2(ref netResource, password, userId, 0);
				System.Diagnostics.Process.Start(dir);
			}
			catch (Exception e1)
			{
				throw e1;
			}
		}
	}
	public static void startWithWaiting(String exePath, String searchTask) {
		WaitingForm f = new WaitingForm();
		f.Show();
		System.Diagnostics.Process.Start(exePath);
		DateTime start = DateTime.Now;
		DateTime end = start.AddMinutes(1);
		bool flg = true;
		while(flg)
		{
			foreach(System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
			{
				if (DateTime.Now > end)
				{
					MessageBox.Show("起動に時間がかかっています");
					f.Hide();
					return;
				}
				if (p.MainWindowHandle != IntPtr.Zero)
				{
					if (searchTask.Equals(p.MainWindowTitle))
					{
						flg = false;
					}
				}
			}
		}
		f.Hide();
	}
	public static void setIcon(BaseForm form) {
		SHSTOCKICONINFO sii = new SHSTOCKICONINFO();
		sii.cbSize = Marshal.SizeOf(sii);
		SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_SMALLICON, ref sii);
		if (sii.hIcon != IntPtr.Zero)
		{
			form.Icon = Icon.FromHandle(sii.hIcon);
		}
	}
	public static void registHotKey() {
		RegisterHotKey(handle, HOTKEY_ID, 0, (int) Keys.F1);
	}
	public static void unRegistHotKey() {
		UnregisterHotKey(handle, HOTKEY_ID);
	}
}
public class MyLauncherApplications: BaseForm {
	public MyLauncherApplications() {
		Controls.Add(new MyButton(1, 1, "", delegate(object sender, System.EventArgs e) {
			System.Diagnostics.Process.Start(@"C:\test\foobar2000.exe");
		}, @"C:\test\foobar2000.exe"));
		Controls.Add(new MyButton(2, 1, "管理ファイル", delegate(object sender, System.EventArgs e) {
			Utils.startWithWaiting(@"C:\Test]\管理.xlsx", "Microsoft Excel - 管理.xlsx");
		}));
	}
}

public class MyLauncher: BaseForm {
	[STAThread]
	public static void Main() {
		GeneratedCodeAttribute generatedCodeAttribute = new GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettindsDesigner.SettingsSingleFileGenerator", "10.0.0.0");
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault(false);
		Application.Run(new MyLauncher());
	}
	public MyLauncher() {
		removeGoTop();
		Controls.Add(new MyButton(1, 1, "Dropbox", delegate(object sender, System.EventArgs e) {
			System.Diagnostics.Process.Start(@"Dropboxフォルダ");
		}));
		Controls.Add(new MyButton(1, 2, "アプリケーション", delegate(object sender, System.EventArgs e) {
			new MyLauncherApplications().Show(this);
		}, false));
	}
}


```

以上