C# 覚書


参考程度にしてください。
 環境は、Microsoft Visual C# 2008 Express Editionです。

実行ファイル名&Ver.
プログラムの終了
スリープ
プロパティ>設定に登録した設定データの操作
ドラッグ&ドロップ
ファイルオープンダイアログ
データグリッドビュー
CSVファイルをデータグリッドビューに読込
ハッシュ関連
文字列を変換
フック関連(キーフック)
外部プログラム起動
スレッドが違ってコントロールを触れない時は、デリゲート
ネット関連
SQL関連
EXCEL操作
SQLによるEXCEL読込
SharpPcapでキャプチャー
ファイルのコピー
Webブラウザ操作
処理の間に溜ったメッセージをパージする

API関数の宣言


実行ファイル名&Ver.

// 実行ファイルの名前
Application.ProductName

// 実行ファイルのバージョン
Application.ProductVersion;

this.Text = Application.ProductName + " Ver." + Application.ProductVersion;

// 引数
string[] cmds;
cmds = System.Environment.GetCommandLineArgs();

// 二重起動確認
using System.Diagnostics;
using System.IO;

Process[] プロセス = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Application.ExecutablePath));
if(プロセス.Length < 0)
{
	// メイン・ウィンドウが最小化されていれば元に戻す
	if (IsIconic(プロセス[0].MainWindowHandle))
		ShowWindowAsync(プロセス[0].MainWindowHandle, SW_RESTORE);

	// メイン・ウィンドウを最前面に表示する
	SetForegroundWindow(プロセス[0].MainWindowHandle);
	
	Environment.Exit(0);
}

ページの最初へ
プログラムの終了
// プログラムの終了
Environment.Exit(0);
ページの最初へ
スリープ
// 1000ミリ秒スリープ
System.Threading.Thread.Sleep(1000);
ページの最初へ
プロパティ>設定に登録した設定データの操作

Properties.Settings.Default.設定に制作した名前; // にてアクセス可能
Properties.Settings.Default.Save();             // セーブしないと保存されない
Properties.Settings.Default.Reset();            // 初期値に戻す(作成時のデータ)
Properties.Settings.Default.Reload();           // 再読み込み(セーブした地点のデータ)
ページの最初へ
ドラッグ&ドロップ
// ドラッグ&ドロップ関数
private void Form1_DragEnter(object sender, DragEventArgs e)
{
	if (e.Data.GetDataPresent(DataFormats.FileDrop))
		e.Effect = DragDropEffects.Copy;
	else
		e.Effect = DragDropEffects.None;
}


private void Form1_DragDrop(object sender, DragEventArgs e)
{
	string[] filenames = (string[])e.Data.GetData(DataFormats.FileDrop);
	foreach (string Tmp_filename in filenames)
	{
		// ファイルの処理
	}
}
ページの最初へ
ファイルオープンダイアログ

// ファイルオープンダイアログ
openFileDialog1.Title = "Opne File Dialog";  // 適時変更
openFileDialog1.DefaultExt = @"csv";         // 適時変更
openFileDialog1.Filter = @"CSV FILE|*.csv";  // 適時変更
openFileDialog1.FileName = "";               // 適時変更
if (openFileDialog1.ShowDialog() == DialogResult.OK)
	ファイル処理(openFileDialog1.FileName);

// 保存用は、openFileDialog1をsaveFileDialog1に変更する。
ページの最初へ
データグリッドビュー

//(ArrayList)データにタブ区切りデータを入れ、dataGridViewに表示する
for (int ii = 0; ii < ヘッダー.Count; ii++) // まずヘッダー作成
	SetDGVTBC((string)ヘッダー[ii], DataGridViewContentAlignment.MiddleCenter, DataGridViewContentAlignment.MiddleLeft, セルの幅);

for (int ii = 0; ii < データ.Count; ii++)
{
	string Tmp = (string)データ[ii];
	string[] Tmp2 = Tmp.Split('\t');
	dataGridView1.Rows.Add(Tmp2);
}

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);  //セル幅を更新


//データグリッドビューを列を登録するサブ
private void SetDGVTBC(string 名称, DataGridViewContentAlignment ヘッダ, DataGridViewContentAlignment セル, int 幅)
{
	DataGridViewTextBoxColumn textColumn;
	textColumn = new DataGridViewTextBoxColumn();
	textColumn.DataPropertyName = 名称;
	textColumn.Name = 名称;
	textColumn.HeaderText = 名称;
	textColumn.HeaderCell.Style.Alignment = ヘッダ;
	textColumn.DefaultCellStyle.Alignment = セル;
	textColumn.SortMode = DataGridViewColumnSortMode.NotSortable;
	textColumn.Width=幅;
	dataGridView1.Columns.Add(textColumn);
}


// セル単位で表示方法を変更する
dataGridView1.Rows[row].Cells[MyColumn]].Style.Alignment = DataGridViewContentAlignment.BottomLeft;


// 行単位で文字色を変更する
dataGridView1.Rows[row].DefaultCellStyle.ForeColor = Color.Gray;


// 選択モード指定
dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;


//選択範囲をクリップボードへコピー
private void 選択範囲をクリップボードへ()
{
	string Tmp_string;

	//クリップボードの情報を取得
	Clipboard.SetDataObject(dataGridView1.GetClipboardContent());
	//文字コード変換とHTML変換
	string ClipStr = (String)Clipboard.GetData(DataFormats.Text.ToString());

	if (ClipStr == null)
		return;

	Tmp_string= ClipStr;

	//文字コードをUTFからShift-JISに変更する。
	byte[] bytesData;
	//Shift-JISとしてバイト配列化
	bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(Tmp_string);
	//配列をShift-JIS文字変数に変更
	string SjisStr = System.Text.Encoding.GetEncoding(932).GetString(bytesData);

	//Shift-JISのHTMLをClipboardに送る。
	Clipboard.SetText(SjisStr);
}


	// dataGridView1の内容をCSVファイルに保存する
	// 一行目は、項目名
	private void CSV保存()
	{
		string Tmp_string = @"";

		if (dataGridView1.Columns.Count <= 0)
			return;

		if (saveFileDialog1.ShowDialog() == DialogResult.OK)
		{
			// CSVファイルオープン
			StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, System.Text.Encoding.GetEncoding("SHIFT-JIS"));

			for (int c = 0; c <= dataGridView1.Columns.Count - 1; c++)
			{
				// DataGridViewのヘッダーセルのデータ取得
				String dt = "";

				if (dataGridView1.Columns[c].HeaderText != null)
					dt = dataGridView1.Columns[c].HeaderText.ToString();

				if (c < dataGridView1.Columns.Count - 1)
					dt = dt + ",";

				sw.Write(dt);
			}

			sw.Write("\r\n");

			for (int r = 0; r <= dataGridView1.Rows.Count - 1; r++)
			{
				for (int c = 0; c <= dataGridView1.Columns.Count - 1; c++)
				{
					// DataGridViewのセルのデータ取得
					String dt = "";
					if (dataGridView1.Rows[r].Cells[c].Value != null)
					{
						mp_string = dataGridView1.Rows[r].Cells[c].Value.ToString();
						//データに「,」が含まれている場合「"」で囲む
						if (Tmp_string.IndexOf(',') < 0) 
							dt = Tmp_string;
						else
							dt = "\"" + Tmp_string + "\"";
					}
					if (c < dataGridView1.Columns.Count - 1)
							dt = dt + ",";

					sw.Write(dt);
				}
				sw.Write("\r\n");
			}
			// CSVファイルクローズ
			sw.Close();
		}
	}


ページの最初へ
CSVファイルをデータグリッドビューに読込

using Microsoft.VisualBasic.FileIO;   // VisualBasic.FileIOを借用

public void ReadCsv(String ファイル名)  // オープンするファイル名を渡す
{
	string[] csv;
	TextFieldParser parser = new TextFieldParser(ファイル名, System.Text.Encoding.Default);
	parser.TextFieldType = FieldType.Delimited;
	parser.SetDelimiters(","); // 区切り文字はコンマ

	csv = parser.ReadFields(); // 1行読み込み
	if (csv.Length == 1)       // もし分割出来ない時は、区切り文字はコンマで再挑戦
	{
		parser.Close();
		parser = new TextFieldParser(fp, System.Text.Encoding.Default);
		parser.TextFieldType = FieldType.Delimited;
		parser.SetDelimiters("\t"); // 区切り文字はコンマ

		csv = parser.ReadFields(); // 1行読み込み
	}

	for (int ii = 0; ii < csv.Length; ii++)
		SetDGVTBC(csv[ii], DataGridViewContentAlignment.MiddleCenter, DataGridViewContentAlignment.MiddleCenter);

	while (!parser.EndOfData)
	{
		csv = parser.ReadFields(); // 1行読み込み
		dataGridView1.Rows.Add(csv);
	}
}
ページの最初へ
ハッシュ関連

// 定義
SortedDictionary<string, string> ハッシュ = new SortedDictionary<string, string>();

// 一覧
foreach (KeyValuePair<string, string> Tmp_ in ハッシュ)
	string Tmp_string = Tmp_.Value;

// 代入
ハッシュ[参照Key] = 入力データ;

// 取出
if (ハッシュ.ContainsKey(参照Key))
// あり
	string 取得値 = ハッシュ[参照Key];
else
// なし

ページの最初へ
文字列を○○に変換

// 文字列を数値に変換
try
{
	double Tmp_double = double.Parse(Tmp_String);
}
catch (Exception e)
{
	Tmp_double = 0;
	string ErrMsg = e.Message;
}


//分を時間+分の形式に変換 ex.460 > 740
private string 時分(double 分)
{
	return Math.Floor(分 / 60.0).ToString("#,##0") + ":" + (分 % 60.0).ToString("00");
}
ページの最初へ
フック関連(キーフック)

using System.Runtime.InteropServices;  // using追加
using System.Diagnostics;              // using追加


private IntPtr hookId;
private InterceptKeys.LowLevelKeyboardProc hookProc;

public Form1()
{
	this.hookProc = new InterceptKeys.LowLevelKeyboardProc(this.HookCallback);
	this.hookId = InterceptKeys.SetHook(this.hookProc);
}


private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
	if(0 <= nCode)
	{
		// 処理
		char vkCode = (char)Marshal.ReadInt32(lParam);
		if (wParam == (IntPtr)InterceptKeys.WM_KEYDOWN || wParam == (IntPtr)InterceptKeys.WM_SYSKEYDOWN)
		{
			if ((vkCode < '0') || ('Z' < vkCode))
			{
			// キー入力を処理(0〜Z)
			}
		}
	}
	return InterceptKeys.CallNextHookEx(this.hookId, nCode, wParam, lParam);
}
ページの最初へ
外部プログラム起動

// 外部プログラム起動
using System.Threading; // おまじない System.Diagnostics.Process process = System.Diagnostics.Process.Start(プログラム名,引数); process.EnableRaisingEvents = true; process.Exited += new EventHandler(Process_Exited); // 終了時に実装される関数を定義 }
ページの最初へ
スレッドが違ってコントロールを触れない時は、デリゲート

// Invoke() デリゲート
private delegate void デリゲート);  // 宣言しておきましょう


new Thread(new ThreadStart(delegate
{
	Invoke((デリゲート)delegate
	{
		// コントロールのプロパティ―等を変更
	});
})).Start();
ページの最初へ
ネット関連

// ドメイン取得
Environment.UserDomainName

// ユーザー名取得
Environment.UserName;

// ネットワークが利用できない場合は終了する
if (!NetworkInterface.GetIsNetworkAvailable())
	return;

// NetBios名取得
Environment.MachineName;

// ホスト名取得
Dns.GetHostName();

// IPアドレス所得
IPAddress[] adrList = Dns.GetHostAddresses(hostname);
foreach (IPAddress address in adrList)
{
	if (!IPAddress.IsLoopback(address))  // ループバックアドレス???
}

//IPアドレスからMacアドレスを得る
private byte[] getMacAddress(IPAddress addr)
{
	byte[] mac = new byte[6];
	int len = mac.Length;

	try
	{
		int r = SendARP(BitConverter.ToInt32(addr.GetAddressBytes(), 0), 0, mac, ref len);
		if (r != 0)
		{
			int popo = 0;
		}
	}

	catch (FormatException)
	{
	// エラー処理
	}

	return mac;
}


// ping送信
private bool Send_Ping(string IP)
{
	bool リザルト = false;

	System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
	for (int ii = 0; ii > 5; ii++)
	{
		Application.DoEvents();
		System.Net.NetworkInformation.PingReply reply = p.Send(IP, 500);

		if (reply.Status == System.Net.NetworkInformation.IPStatus.Success)
		{
			リザルト = true;
			break;
		}
		else
		{
			リザルト = false;
		}
	}
	p.Dispose();

	return リザルト;
}

ページの最初へ
SQL実行

using System.Data.Odbc;  // おまじない

private void SQL実行()
{
	OdbcConnection myAccessConn = null;
	DataTable myDataTable = new DataTable();
	DataTable myDataTable2 = new DataTable();
	OdbcDataAdapter myDataAdapter = null;
	OdbcCommand myAccessCommand = null;

	DataRowCollection rows = null;
	OdbcDataReader Tmp_OdbcDataReader = null;

	string strAccessSelect = @"SELECT オーダ FROM TABE1";
	string strAccessSelect_2 = @"SELECT 指図 FROM TABLE2";
	string strAccessSelect_3 = "SELECT SUM(作業時間) FROM TABLE3";

	myDataTable.Clear();

	try
	{
		myAccessConn = new OdbcConnection(strAccessConn);
		myAccessConn.Open();

		//詳細
		myAccessCommand = new OdbcCommand(strAccessSelect, myAccessConn);
		myDataAdapter = new OdbcDataAdapter(myAccessCommand);
		myDataAdapter.Fill(myDataTable);

		//詳細2
		myAccessCommand = new OdbcCommand(strAccessSelect_2, myAccessConn);
		myDataAdapter = new OdbcDataAdapter(myAccessCommand);
		myDataAdapter.Fill(myDataTable);

		//一つのテーブルに2回のSQL結果を入れ ソートして新しいDataTable作成
		DataRow[] ddd = myDataTable.Select("", "指図,品目コード,手順番号");
		myDataTable2 = myDataTable.Clone();
		myDataTable2.Rows.Clear();
		for (int ii = 0; ii < ddd.Length; ii++)
			myDataTable2.ImportRow(ddd[ii]);
		
		dataGridView1.DataSource = myDataTable2;
		dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

		//集計
		myAccessCommand = new OdbcCommand(strAccessSelect_3, myAccessConn);
		Tmp_OdbcDataReader = myAccessCommand.ExecuteReader();
		while (Tmp_OdbcDataReader.Read())
			tB_合計時間.Text = (double.Parse(Tmp_OdbcDataReader[0].ToString()) /60.0).ToString("#,##0.00");

		Tmp_OdbcDataReader.Close();
	}

	catch (Exception ex)
	{
	}

	finally
	{
		myAccessConn.Close();
	}
}
ページの最初へ
EXCEL操作

using MyExcel = Microsoft.Office.Interop.Excel;



private void エクセル操作(string Excel_path) {
	MyExcel.Range range;
	string Tmp;

	// エクセルアプリの作成
	MyExcel.Application Tmp_Excel = new MyExcel.Application();
	MyExcel.Workbooks Tmp_Books = Tmp_Excel.Workbooks;

	// エクセルファイルを開く
	MyExcel.Workbook Tmp_Book = (MyExcel.Workbook)(Tmp_Excel.Workbooks.Open(Excel_path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing));

	MyExcel.Sheets Tmp_Sheets = Tmp_Book.Sheets;

	// 一枚目のシートを操作
	Microsoft.Office.Interop.Excel.Worksheet mySheet = (MyExcel.Worksheet)Tmp_Sheets[1];

	range = mySheet.get_Range("B40", Type.Missing);

	// セル(B40)に TEST を書き込む
	mp = "TEST"
	range.set_Value(Type.Missing, Tmp);

	// 式 =1+2+S40 を書き込む
	Tmp = "=1+2+S40"
	range.FormulaLocal = Tmp;

	// 表示形式 0.00% を書き込む
	Tmp = "0.00%"
	range.NumberFormat = Tmp;

	// 保存
	Tmp_Book.Save();
	//Tmp_Book.SaveAs(Excel_path, MyExcel.XlFileFormat.xlExcel12, Type.Missing, Type.Missing, Type.Missing, Type.Missing, MyExcel.XlSaveAsAccessMode.xlNoChange, MyExcel.XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
	Tmp_Books.Close();
	Tmp_Excel.Quit();
ページの最初へ
SQLでExcel読込

// ヘッダに項目名が入り、データにタブ区切りでデータが入る

public void Excel読込(string ファイル名, string シート名, ArrayList ヘッダ, ArrayList データ)
{
	DataTable Tmp_DataTable = new DataTable();
	string 接続文字列;
	string SQL文字列;
	OleDbConnection Tmp_OleDbConnection;
	OleDbCommand Tmp_OleDbCommand;
	OleDbDataAdapter Tmp_OleDbDataAdapter;

	try
	{
		接続文字列 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=";
		接続文字列 += ファイル名.Replace(@"\", @"\\");
		接続文字列 += "; Extended Properties=\"Excel 12.0;HDR=YES;\"";

		SQL文字列 = "SELECT * FROM [" + シート名 + "]";
		// SQL文字列 = "SELECT * FROM [" + シート名 + "$A1:C10]";  // 表の一部を指定可

		Tmp_OleDbConnection = new OleDbConnection();
		Tmp_OleDbConnection.ConnectionString = 接続文字列;
		Tmp_OleDbConnection.Open();
		Tmp_OleDbCommand = new OleDbCommand(SQL文字列, Tmp_OleDbConnection);
		Tmp_OleDbDataAdapter = new OleDbDataAdapter(Tmp_OleDbCommand);
		Tmp_OleDbDataAdapter.Fill(Tmp_DataTable);
		Tmp_DataTable.Dispose();
		Tmp_OleDbDataAdapter.Dispose();
		Tmp_OleDbCommand.Dispose();
		Tmp_OleDbConnection.Close();
		Tmp_OleDbConnection.Dispose();

		// 一行目を列項目名としている
		DataColumnCollection Tmp_DataColumnCollection = Tmp_DataTable.Columns;
		foreach (DataColumn Tmp_Column in Tmp_DataColumnCollection)
		{
			ヘッダ.Add( Tmp_Column.ColumnName);
		}

		foreach (DataRow Tmp_Row in Tmp_DataTable.Rows)
		{
			Object[] Tmp_columns = Tmp_Row.ItemArray;
			string Tmp_string = "";
			for (int n = 0; n < Tmp_columns.Length - 1; n++)
				Tmp_string += Tmp_columns[n].ToString() + "\t";

			Tmp_string += Tmp_columns[Tmp_columns.Length - 1].ToString();
			データ.Add(Tmp_string);
		}
	}

	catch (OleDbException e)
	{
		MessageBox.Show(e.Message);
	}

}
ページの最初へ
SharpPcapでキャプチャー

SharpPcapのバージョンは、Ver.4.0です。
ネット上で拾ったサンプル(Ver.3と思われる)が、compile出来なかったのでバージョンに注意

using SharpPcap;
using PacketDotNet;
using System.Diagnostics;
using System.Net;
using System.Net.NetworkInformation;
using System.Threading;

// デバイスが無ければ終了
if (SharpPcap.WinPcap.WinPcapDeviceList.Instance.Count < 1)
{
	Debug.WriteLine("No. Devices were found on this machine");
	return;
}

// デバイス一覧列挙
try{
	foreach (SharpPcap.WinPcap.WinPcapDevice device in SharpPcap.WinPcap.WinPcapDeviceList.Instance)
	{
		Debug.WriteLine("FriendlyName: " + device.Interface.FriendlyName);
		Debug.WriteLine("Name: " + device.Interface.Name);

		// インターフェース
		foreach (SharpPcap.LibPcap.PcapAddress addr in device.Interface.Addresses)
		{
			Debug.WriteLine("Addr	 : " + addr.Addr);
			Debug.WriteLine("Netmask  : " + addr.Netmask);
			Debug.WriteLine("Broadaddr: " + addr.Broadaddr);
			Debug.WriteLine("Dstaddr  : " + addr.Dstaddr);

			if (addr.Netmask != null)
			{
				if (addr.Netmask.ipAddress != null)
					this.comboBox1.Items.Add(addr.Addr.ToString());
			}
		}

		Debug.WriteLine("MacAddress: " + device.Interface.MacAddress);
		Debug.WriteLine("Flags: " + device.Interface.Flags);
		Debug.WriteLine("Description: " + device.Interface.Description);
	}
}
catch (Exception e2)
{
	MessageBox.Show(e2.Message);
}


// デバイスオープン&イベントハンドラ追加

// とりあえず一番最初のデバイスで
SharpPcap.WinPcap.WinPcapDevice 対象デバイス= SharpPcap.WinPcap.WinPcapDeviceList.Instance[0];
// イベントハンドラ追加
対象デバイス.OnPacketArrival += OnPacketArrival;
// デバイスオープン
int readTimeoutMilliseconds = 1000;
対象デバイス.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
//対象デバイス.Filter = @"ip and tcp";  // フィルター指定可能
対象デバイス.StartCapture();
MessageBox.Show("run");  // ダイアログを閉じるまで
対象デバイス.StopCapture();
Debug.WriteLine(対象デバイス.Statistics.ToString());
対象デバイス.Close();



// イベントハンドラ
private void OnPacketArrival(object sender, CaptureEventArgs e)
{
	Packet Tmp_Packet = null; ;
	EthernetPacket Tmp_E = null; ;
	IPv4Packet Tmp_V4 = null;

	string SourcePort = @"";
	string DestinationPort = @"";

	DateTime time = e.Packet.Timeval.Date;
	int len = e.Packet.Data.Length;
	Debug.WriteLine(String.Format("{0}:{1}:{2},{3} Len={4}",time.Hour, time.Minute, time.Second, time.Millisecond, len));
	Debug.WriteLine(e.Packet.ToString());

	try
	{
		if (e.Packet.LinkLayerType == LinkLayers.Ethernet)
		{
			Tmp_Packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
			Tmp_E = (EthernetPacket)Tmp_Packet;
			if (Tmp_E.Type == EthernetPacketType.IpV4)
			{
				Tmp_V4 = (IPv4Packet)Tmp_E.PayloadPacket;
				if ((Tmp_V4.SourceAddress.ToString().IndexOf(@"192.168.135.1") != 0) && (Tmp_V4.DestinationAddress.ToString().IndexOf(@"192.168.135.1") != 0))  // 192.168.135.1が関与
				{
					if (Tmp_V4.Protocol == IPProtocolType.TCP)    // TCPの時
					{
						TcpPacket Tmp_ = (TcpPacket)Tmp_V4.PayloadPacket;
						SourcePort = Tmp_.SourcePort.ToString();
						DestinationPort = Tmp_.DestinationPort.ToString();
					}
					else if (Tmp_V4.Protocol == IPProtocolType.UDP) // UDPの時
					{
						UdpPacket Tmp_ = (UdpPacket)Tmp_V4.PayloadPacket;
						SourcePort = Tmp_.SourcePort.ToString();
						DestinationPort = Tmp_.DestinationPort.ToString();
					}
					else
					{
					
					}

					string Msg = Tmp_V4.SourceAddress.ToString() + "(" + SourcePort + ") > ";
					Msg += Tmp_V4.DestinationAddress.ToString() + "(" + DestinationPort + ") [";
					Msg += Tmp_V4.Protocol.ToString() + "]";
					Debug.WriteLine(Msg);

					new Thread(new ThreadStart(delegate   // デリゲートでないとスレッドが違う
					{
						Invoke((デリゲート)delegate
						{
							this.listBox1.Items.Add(Msg);
						});
					})).Start();
				}
			}
			else
			{
				Debug.WriteLine(e.Packet.LinkLayerType);
			}
		}
		else
		{
			string Msg = Tmp_E.SourceHwAddress.ToString() +" > ";
			Msg += Tmp_E.DestinationHwAddress  + " [";
			Msg += Tmp_E.Type + "]";
			Debug.WriteLine(Msg);
			new Thread(new ThreadStart(delegate
			{
				Invoke((デリゲート)delegate
				{
					this.listBox1.Items.Add(Msg);
				});
			})).Start();
		}

	}
	catch (Exception e2)
	{
		Debug.WriteLine(e2.Message);
	}
}
ページの最初へ
Visual Basic の My ファイル システム オブジェクトを使用

// 添付ファイルにコピー
using Microsoft.VisualBasic.FileIO;
using System.IO;

string TempFileName = Path.GetTempFileName();
FileSystem.CopyFile(SourceFileName, TempFileName, UIOption.AllDialogs, UICancelOption.DoNothing);
// UIOption = AllDialogs:プログレス ダイアログ ボックスを表示
// UICancelOption = DoNothing:[キャンセル] がクリック時何もしない

// ディレクトリなら、CopyDirectory(SourceDirectory,DestinationDirectory)
// 削除では、DeleteFile(DeleteFileName)
ページの最初へ
WebBrowserの操作

// コモンコントロールのwebBrowserを配置しておきます。
webBrowser1.Navigate(URL); 	// 「URL」へ移動
HtmlDocument myDocument = webBrowser1.Document;                  // ページを読込
HtmlElement Tag_Temp = myDocument.GetElementById("LBL_Title");   // idが「LBL_Title」の要素を得る
if( Tag_Temp != null)
{
	Tag_Temp.Focus();
	Tag_Temp.InnerText = 入力データ;      //要素に「入力データ」を入力する。
//	Tag_Temp.InvokeMember("click");  // クリックする時は、これ
}


// 直接ソースを読込?
WebClient wc = new WebClient();
byte[] data = wc.DownloadData(URL);                 // 「URL」より、HTMLのソースを「data」に読み込む
Encoding enc = Encoding.GetEncoding("Shift_JIS");   // Shift_JISにてエンコード準備(HTMLヘッダーから判断すれば)
string Tmp_html = enc.GetString(data);              // エンコードしてTmp_htmlにセットする。


// ボタンクリックが、上記で出来ない場合、カーソルを移動して、クリックイベントを送る
HtmlElement Tmp_e = myDocument.GetElementById(@"BTN_Out");                    // 「BTN_Out」要素抽出
int Pos_x = Tmp_e.OffsetRectangle.Left + Tmp_e.ClientRectangle.Width / 2;     // X座標 実際には、そのウインドウの位置を足す
int Pos_y = Tmp_e.OffsetRectangle.Top + Tmp_e.ClientRectangle.Height / 2;     // Y座標 ex.this.Top + SystemInformation.CaptionButtonSize.Height 等
Cursor.Position = new Point(Pos_x, Pos_y);     // カーソル移動
INPUT[] input = new INPUT[2];
input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;    // 左ボタンダウン
input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;      // 左ボタンアップ
this.Focus();
SendInput(2, input, Marshal.SizeOf(input[0])); // イベント送信
// APIや定数の宣言は、別に記述しています。
ページの最初へ
処理の間に溜ったメッセージをパージする

private void メッセージのパージ()
{
	MSG msg2 = new MSG();
	while (PeekMessage(ref msg2, 0, 0, 0, PeekMsgOption.PM_REMOVE))
	{
		switch (msg2.Msg)
		{
			case WM_PAINT:
				DispatchMessage(ref msg2);
				break;
		}
    }
}
ページの最初へ



















API関数の宣言

[DllImport("user32.dll")]
extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("User32.Dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
public static extern int GetClassName(IntPtr hWnd, StringBuilder s, int nMaxCount);

[DllImport("User32.Dll")]
static extern int IsWindowVisible(IntPtr hWnd);

[DllImport("User32.Dll", EntryPoint = "GetWindowText", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

[DllImport("user32.dll")]
private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, String lParam);

[DllImport("User32.Dll")]
static extern IntPtr GetDesktopWindow();

[DllImport("user32.dll")]
private static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, int bRepaint);

[DllImport("User32.Dll")]
static extern int GetWindowRect(IntPtr hWnd, out RECT rect);
	[StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 4)]
		private struct RECT
		{
			public int left, top, right, bottom;
		}

[DllImport("user32.dll", SetLastError = true)]
static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni);

[DllImport("User32.Dll")]
static extern int ShowWindow(IntPtr hWnd, int nCmdShow);

[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);


const uint WM_CLOSE = 0x10;
const uint WM_LBUTTONDOWN = 0x201;
const uint WM_LBUTTONUP = 0x202;
const uint WM_SETTEXT = 0xC;

//ShowWindow関数の宣言
const int SW_HIDE = 0;
const int SW_SHOWNORMAL = 1;
const int SW_NORMAL = 1;
const int SW_SHOWMINIMIZED = 2;
const int SW_SHOWMAXIMIZED = 3;
const int SW_MAXIMIZE = 3;
const int SW_SHOWNOACTIVATE = 4;
const int SW_SHOW = 5;
const int SW_MINIMIZE = 6;
const int SW_SHOWMINNOACTIVE = 7;
const int SW_SHOWNA = 8;
const int SW_RESTORE = 9;
const int SW_SHOWDEFAULT = 10;
const int SW_FORCEMINIMIZE = 11;
const int SW_MAX = 11;


[DllImport("User32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("User32.Dll")]
private static extern IntPtr GetParent(IntPtr hWnd);

(DllImport("user32.dll")]
private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

[DllImport("user32.dll")]
private static extern int EnumWindows(EnumWindowsDelegate lpEnumFunc, int lParam);

[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();

[DllImport("coredll.lib")]
public static extern IntPtr GetForegroundKeyboardTarget();








// ボタンクリック用
[DllImport("user32.dll")]
extern static uint SendInput(
	uint nInputs,     // INPUT 構造体の数(イベント数)
	INPUT[] pInputs,  // INPUT 構造体
	int cbSize        // INPUT 構造体のサイズ
	);

[StructLayout(LayoutKind.Sequential)]  // アンマネージ DLL 対応用 struct 記述宣言
struct INPUT
{
	public int type;  // 0 = INPUT_MOUSE(デフォルト), 1 = INPUT_KEYBOARD
	public MOUSEINPUT mi;
	// Note: struct の場合、デフォルト(パラメータなしの)コンストラクタは、
	//	言語側で定義済みで、フィールドを 0 に初期化する。
}

[StructLayout(LayoutKind.Sequential)]  // アンマネージ DLL 対応用 struct 記述宣言
struct MOUSEINPUT
{
	public int dx;
	public int dy;
	public int mouseData;   // amount of wheel movement
	public int dwFlags;
	public int time;        // time stamp for the event
	public IntPtr dwExtraInfo;
	// Note: struct の場合、デフォルト(パラメータなしの)コンストラクタは、
	//	言語側で定義済みで、フィールドを 0 に初期化する。
}

// dwFlags
const int MOUSEEVENTF_MOVED = 0x0001;
const int MOUSEEVENTF_LEFTDOWN = 0x0002;    // 左ボタン Down
const int MOUSEEVENTF_LEFTUP = 0x0004;      // 左ボタン Up
const int MOUSEEVENTF_RIGHTDOWN = 0x0008;   // 右ボタン Down
const int MOUSEEVENTF_RIGHTUP = 0x0010;     // 右ボタン Up
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;  // 中ボタン Down
const int MOUSEEVENTF_MIDDLEUP = 0x0040;    // 中ボタン Up
const int MOUSEEVENTF_WHEEL = 0x0080;
const int MOUSEEVENTF_XDOWN = 0x0100;
const int MOUSEEVENTF_XUP = 0x0200;
const int MOUSEEVENTF_ABSOLUTE = 0x8000;

const int screen_length = 0x10000;  // for MOUSEEVENTF_ABSOLUTE (この値は固定)



// SHGetFileInfo関数
[DllImport("shell32.dll")]
private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);

// SHGetFileInfo関数で使用するフラグ
private const uint SHGFI_ICON = 0x100; // アイコン・リソースの取得
private const uint SHGFI_LARGEICON = 0x0; // 大きいアイコン
private const uint SHGFI_SMALLICON = 0x1; // 小さいアイコン

// SHGetFileInfo関数で使用する構造体
private struct SHFILEINFO
{
	public IntPtr hIcon;
	public IntPtr iIcon;
	public uint dwAttributes;
	[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
	public string szDisplayName;
	[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
	public string szTypeName;
};


[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);

[DllImport("iphlpapi.dll", ExactSpelling = true)]
private static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref int PhyAddrLen);


// Win32 APIのインポート
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PeekMessage(ref MSG lpMsg, Int32 hwnd, Int32 wMsgFilterMin, Int32 wMsgFilterMax, PeekMsgOption wRemoveMsg);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool TranslateMessage(ref MSG lpMsg);
[DllImport("user32.dll", SetLastError = true)]
private static extern Int32 DispatchMessage(ref MSG lpMsg);

// メッセージの処理方法オプション
private enum PeekMsgOption
{
	PM_NOREMOVE = 0,  // 処理後、メッセージをキューから削除しない
	PM_REMOVE      // 処理後、メッセージをキューから削除する 
}

// Windowsメッセージの定義
private const Int32 WM_PAINT = 0x000F;

// メッセージ構造体
[StructLayout(LayoutKind.Sequential)]
struct MSG
{
	public Int32 HWnd;    // ウィンドウ・ハンドル
	public Int32 Msg;     // メッセージID
	public Int32 WParam;  // WParamフィールド(メッセージIDごとに違う)
	public Int32 LParam;  // LParamフィールド(メッセージIDごとに違う)
	public Int32 Time;    // 時間
	public POINTAPI Pt;   // カーソル位置(スクリーン座標)
}
[StructLayout(LayoutKind.Sequential)]
struct POINTAPI
{
	public Int32 x;      // x座標
	public Int32 y;      // y座標


ページの最初へ
 


ページの最初へ