public WorkInfoData(WorkInfoKey key) { this.key = key; }
/// <summary> /// 1000 [ms]毎に情報取得 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tick(object sender, EventArgs e) { Console.WriteLine("ticked."); // アクティブウィンドウ(フォアグラウンド)のハンドル取得 IntPtr hWnd = GetForegroundWindow(); // プロセスID取得 int id; GetWindowThreadProcessId(hWnd, out id); // プロセス情報取得 Process p = Process.GetProcessById(id); if (p == null) { return; } StringBuilder sb = new StringBuilder(65535); //256とかでええんか?に特に意味はない GetWindowText(GetForegroundWindow(), sb, 65535); WorkInfoKey key = new WorkInfoKey(p.ProcessName, sb.ToString()); // まずはすでに存在するデータかどうか検索 WorkInfoData foundData = null; foreach (var data in this.blist) { if (key.Equals(data.key)) { foundData = data; break; } } if (foundData != null) { // すでにあるのでデータ更新のみ foundData.incTestCounter(); } else { // 新規データ var value = new WorkInfoData(key); this.blist.Add(value); value.incTestCounter(); } // 以下でもいいが、ポーリングしたくないのでDataにINotifyPropertyChangedを実装する方式にする // this.dataGridView1.Refresh(); // ここで、改めてソートした方がいいかも? // TODO:以下のやり方でいいのかよくわからない。。。 #if false // ソート状態を調べる DataGridViewColumn sortOrderColumn = null; SortOrder sortOrder = SortOrder.None; foreach (DataGridViewColumn column in this.dataGridView1.Columns) { if (column.HeaderCell.SortGlyphDirection != SortOrder.None) { sortOrderColumn = column; sortOrder = column.HeaderCell.SortGlyphDirection; break; // とりあえず、単一ソートのみと仮定 } } if (sortOrderColumn != null) { // ソートされている列があるので、並び替えを行う this.dataGridView1.Sort(sortOrderColumn, (sortOrder == SortOrder.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending); } #endif }