本文實例講述了C#獲取進程或線程相關信息的方法。分享給大家供大家參考。具體實現方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace ConsoleApp { class ProcessDo { /// <summary> /// 獲取進程相關信息 /// </summary> public static void GetProcessInfomation() { Process pro = Process.GetProcessesByName( "QQ" )[0]; Console.WriteLine( "進程名稱:" + pro.ProcessName); Console.WriteLine( "進程ID:" + pro.Id.ToString()); Console.WriteLine( "啟動時間:" + pro.StartTime.ToLongDateString() + pro.StartTime.ToLongTimeString()); Console.WriteLine( "是否響應:" + pro.Responding.ToString()); Console.WriteLine( "關聯進程句柄:" + pro.Handle.ToString()); Console.WriteLine( "進程打開的句柄數:" + pro.HandleCount.ToString()); Console.WriteLine( "主窗口句柄:" + pro.MainWindowHandle.ToString()); Console.WriteLine( "主窗口標題:" + pro.MainWindowTitle); Console.WriteLine( "模塊數量:" + pro.Modules.Count.ToString()); Console.WriteLine( "基本優先級:" + pro.BasePriority.ToString()); Console.WriteLine( "提升優先級:" + pro.PriorityBoostEnabled.ToString()); Console.WriteLine( "處理器:" + pro.ProcessorAffinity.ToInt32().ToString()); Console.WriteLine( "最小工作集:" + pro.MinWorkingSet.ToInt32().ToString()); Console.WriteLine( "最大工作集:" + pro.MaxWorkingSet.ToInt32().ToString()); Console.WriteLine( "工作集:" + pro.WorkingSet.ToString()); Console.WriteLine( "峰值工作集:" + pro.PeakWorkingSet.ToString()); Console.WriteLine( "專用內存大小:" + pro.PrivateMemorySize.ToString()); Console.WriteLine( "未分頁內存大?。?quot; + pro.NonpagedSystemMemorySize.ToString()); Console.WriteLine( "分頁內存大?。?quot; + pro.PagedMemorySize.ToString()); Console.WriteLine( "峰值分頁內存大?。?quot; + pro.PeakPagedMemorySize.ToString()); Console.WriteLine( "虛擬內存大?。?quot; + pro.VirtualMemorySize.ToString()); Console.WriteLine( "峰值虛擬內存大?。?quot; + pro.PeakVirtualMemorySize.ToString()); Console.WriteLine( "占用時間:" + pro.TotalProcessorTime.ToString()); Console.WriteLine( "特權占用時間:" + pro.PrivilegedProcessorTime.ToString()); Console.WriteLine( "用戶占用時間:" + pro.UserProcessorTime.ToString()); } /// <summary> /// 進程的線程詳細信息 /// </summary> public static void GetProcessThreadInfomation() { Process pro = Process.GetProcessesByName( "QQ" )[0]; Console.WriteLine( "QQ程序進程的線程詳細信息如下:" ); int length = pro.Threads.Count; for ( int i = 0; i < length; i++) { var thread = pro.Threads[i]; Console.WriteLine( "標識符:" + thread.Id.ToString()); Console.WriteLine( "基本優先級:" + thread.BasePriority.ToString()); Console.WriteLine( "當前優先級:" + thread.CurrentPriority.ToString()); Console.WriteLine( "內存地址:" + thread.StartAddress.ToInt32()); Console.WriteLine( "啟動時間:" + thread.StartTime.ToString()); Console.WriteLine( "使用時間:" + thread.UserProcessorTime.ToString()); Console.Write( "當前狀態:" ); switch (thread.ThreadState) { case ThreadState.Initialized: Console.WriteLine( "線程已經初始化但尚未啟動" ); break ; case ThreadState.Ready: Console.WriteLine( "線程準備在下一個可用的處理器上運行" ); break ; case ThreadState.Running: Console.WriteLine( "當前正在使用處理器" ); break ; case ThreadState.Standby: Console.WriteLine( "線程將要使用處理器" ); break ; case ThreadState.Terminated: Console.WriteLine( "線程已完成執行并退出" ); break ; case ThreadState.Transition: Console.WriteLine( "線程在可以執行錢等待處理器之外的資源" ); break ; case ThreadState.Unknown: Console.WriteLine( "狀態未知" ); break ; case ThreadState.Wait: Console.WriteLine( "正在等待外圍操作完成或者資源釋放" ); break ; default : break ; } if (thread.ThreadState == ThreadState.Wait) { Console.Write( "等待原因:" ); switch (thread.WaitReason) { case ThreadWaitReason.EventPairHigh: Console.WriteLine( "線程正在等待事件對高" ); break ; case ThreadWaitReason.EventPairLow: Console.WriteLine( "線程正在等待事件對低" ); break ; case ThreadWaitReason.ExecutionDelay: Console.WriteLine( "線程執行延遲" ); break ; case ThreadWaitReason.Executive: Console.WriteLine( "線程正在等待計劃程序" ); break ; case ThreadWaitReason.FreePage: Console.WriteLine( "線程正在等待可用的虛擬內存頁" ); break ; case ThreadWaitReason.LpcReceive: Console.WriteLine( "線程正在等待本地過程調用到達" ); break ; case ThreadWaitReason.LpcReply: Console.WriteLine( "線程正在等待對本地過程調用的回復到達" ); break ; case ThreadWaitReason.PageIn: Console.WriteLine( "線程正在等待虛擬內存頁到達內存" ); break ; case ThreadWaitReason.PageOut: Console.WriteLine( "線程正在等待虛擬內存頁寫入磁盤" ); break ; case ThreadWaitReason.Suspended: Console.WriteLine( "線程執行暫停" ); break ; case ThreadWaitReason.SystemAllocation: Console.WriteLine( "線程正在等待系統分配" ); break ; case ThreadWaitReason.Unknown: Console.WriteLine( "線程因位置原因而等待" ); break ; case ThreadWaitReason.UserRequest: Console.WriteLine( "線程正在等待用戶請求" ); break ; case ThreadWaitReason.VirtualMemory: Console.WriteLine( "線程正在等待系統分配虛擬內存" ); break ; default : break ; } } Console.WriteLine(); } } /// <summary> /// 限制應用程序運行時間 /// 即關聯程序超出設置的運行將自動關閉 /// </summary> public static void GetKillAppForWaitTime() { Process proc = new Process(); proc.StartInfo = new ProcessStartInfo( @"C:\Documents and Settings\zkk\桌面\mysql_20120925.sql" ); //啟動應用程序 proc.Start(); //等待程序師徒完成載入 proc.WaitForInputIdle(); //等待程序結束執行 proc.WaitForExit(3000); //如果程序在時間期限之前關閉,HasExited將會是true if (proc.HasExited == false ) { //測試程序是否已經停止回應 if (proc.Responding) { //程序有回應,關閉主視圖 proc.CloseMainWindow(); } else { //如果程序沒有回應,將強制關閉 proc.Kill(); } } } } } |
希望本文所述對大家的C#程序設計有所幫助。