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座標