//////////////////////////
//C# SelectWindows.cs
//////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;				//GetProcessを使う為
using System.Runtime.InteropServices;	//GetWindowRectを使用するために必要

namespace SelectWindows
{
	public class WinInfo : Form
	{
		//RECT構造体を定義
		[StructLayout(LayoutKind.Sequential)]
		public struct RECT
		{
			public int Left;
			public int Top;
			public int Right;
			public int Bottom;
		}
		//GetWindowRect関数を宣言
		[DllImport("user32.dll")]
		[return: MarshalAs(UnmanagedType.Bool)]
		static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

		//メンバープロパティ
		public string wTitle {get; private set;}
		public string wProc {get; private set;}
		public ulong wHnd {get; private set;}
		public int wWidth {get; private set;}
		public int wHeight {get; private set;}
		public string wPath {get; set;}
		//メンバーコントロール
		ListView listView;
		Button btnOK, btnCancel;

		[STAThread]
		public static void Main()
		{
			Application.Run(new WinInfo());
		}

		//コンストラクター
		public WinInfo()
		{
			//this.AutoSize = true;	//trueにすると縮まらなくなる
			this.FormBorderStyle = FormBorderStyle.Sizable;	//FormBorderStyle.Fixed3D;
			this.MinimizeBox = false;
			this.MaximizeBox = false;
			this.Width = 420;
			this.Height = 240;
			this.Text = "Select Windows";
			this.Load += WinInfo_Load;
		}
 
	 	//WM_CLOSE時処理
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);
			string msg;
			if(listView.SelectedItems.Count > 0)
				msg = "\"" + listView.SelectedItems[0].Text + "\"が選択されました。\r\n";
			else
				msg = "何も選択されていませんが、";
			DialogResult dr = MessageBox.Show(msg + "宜しいですか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.No)
			{
				listView.SelectedItems.Clear();
				e.Cancel = true;
			}
		}

		//WM_CREATE時処理
		private void WinInfo_Load(object sender, EventArgs e)
		{
			//OKボタン
			btnOK = new Button();
			btnOK.Location = new Point(ClientSize.Width - btnOK.Width - 10, ClientSize.Height - btnOK.Height - 10);
			btnOK.Text = "OK";
			btnOK.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right);
			btnOK.Click += btnOK_Click;
			this.Controls.Add(btnOK);

			//Cancelボタン
			btnCancel = new Button();
			btnCancel.Location = new Point(10, ClientSize.Height - btnCancel.Height - 10);
			btnCancel.Text = "Cancel";
			btnCancel.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
			btnCancel.Click += btnCancel_Click;
			this.Controls.Add(btnCancel);

			//リストビュー
			listView = new ListView();
			//位置
			listView.Location = new Point(10, 10);
			listView.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
			//サイズ
			listView.Width = ClientSize.Width - 20;
			listView.Height = ClientSize.Height - btnOK.Height - 30;
			//複数選択
			listView.MultiSelect = false;
			//一行選択
			listView.FullRowSelect = true;
			//グリッドラインの表示
			listView.GridLines = true;
			//並び替え表示
			listView.Sorting = SortOrder.Ascending;
			//ポイントで選択できるようにする
			listView.HoverSelection = false;
			//シングルクリック選択
			listView.Activation = ItemActivation.OneClick;
			//チェックボックス有効化
			listView.CheckBoxes = false;
			//リストビューの表示方法
			listView.View = View.Details;
			//ヘッダー定義
			ColumnHeader columnTitle = new ColumnHeader{Text = "タイトル", Width = 140};
			ColumnHeader columnProc = new ColumnHeader{Text = "プロセス", Width = 140};
			ColumnHeader columnHdl = new ColumnHeader{Text = "ハンドル", Width = 100};
			ColumnHeader columnWid = new ColumnHeader{Text = "幅", Width = 50};
			ColumnHeader columnHgt = new ColumnHeader{Text = "高さ", Width = 50};
			ColumnHeader columnPath = new ColumnHeader{Text = "ファイルパス", Width = 240};
			ColumnHeader[] colHeaderRegValue = {				//ヘッダー設定
				columnTitle,
				columnProc,
				columnHdl,
				columnWid,
				columnHgt,
				columnPath
			};
			listView.Columns.AddRange(colHeaderRegValue);		//ヘッダー追加
			//データ設定
			foreach (Process proc in Process.GetProcesses())	//全てのプロセスを列挙する
			{
				//メインウィンドウのタイトルがある時だけ列挙する
				if(proc.MainWindowTitle.Length > 0)
				{
					ListViewItem item = listView.Items.Add(proc.MainWindowTitle);
					item.SubItems.Add(proc.ProcessName);
					item.SubItems.Add(proc.MainWindowHandle.ToString());
					RECT rec;
					GetWindowRect(proc.MainWindowHandle, out rec);
					int w = rec.Right - rec.Left;
					int h = rec.Bottom - rec.Top;
					item.SubItems.Add(w.ToString());
					item.SubItems.Add(h.ToString());
					item.SubItems.Add(proc.MainModule.FileName);
				}
			}
			//FormにListViewを追加
			this.Controls.Add(listView);
		}

		private void btnOK_Click(object sender, EventArgs e)
		{
			if(listView.SelectedItems.Count == 0)
			{
				MessageBox.Show("リスト項目が未選択です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			wTitle = listView.SelectedItems[0].SubItems[0].Text;
			wProc = listView.SelectedItems[0].SubItems[1].Text;
			ulong val;
			if(!ulong.TryParse(listView.SelectedItems[0].SubItems[2].Text, out val))
			{
				MessageBox.Show("ハンドルの値が不正です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				wHnd = 0;
			}
			else
				wHnd = val;
			int len;
			if(!int.TryParse(listView.SelectedItems[0].SubItems[3].Text, out len))
			{
				MessageBox.Show("幅の値が不正です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				wWidth = 0;
			}
			wWidth = len;
			if(!int.TryParse(listView.SelectedItems[0].SubItems[4].Text, out len))
			{
				MessageBox.Show("高さの値が不正です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				wHeight = 0;
			}
			wHeight = len;
			wPath = listView.SelectedItems[0].SubItems[5].Text;
			Close();
		}

		private void btnCancel_Click(object sender, EventArgs e)
		{
			listView.SelectedItems.Clear();
			wTitle = "";
			wProc = "";
			wHnd = 0;
			wWidth = 0;
			wHeight = 0;
			wPath = "";
			Close();
		}
	}
}
