windows mobile下進程查看器的開發不算太難,網上也有很多例子可以參考,我也懶得寫太多解釋,事實上,我也解釋不清楚,因為我自己也仍然不是很清楚,所以也就借寫部落格來理一下自己的思路吧,目前的進程查看器介面如下:
呆是呆了點哈,索效能運行。
首先,進程查看器當然最重要的就是獲得當前啟動並執行所有進程的資訊,這裡我列出的有進程名稱,PID,以及該進程下的線程數,本來還想給出進程佔用的CPU以及記憶體的情況,後來發現這是沒有現成的API函數可以調用的,也就是要自己來計算的,而且計算結果也不會很精確,所以這部分內容等以後有時間了再鑽研鑽研~
來看看具體有關擷取當前進程資訊表的代碼:
這裡比較重要的有
CreateToolhelp32Snapshot:用來擷取當前進程的一個快照的函數
Process32First: 獲得第一個進程的控制代碼的函數
Process32Next: 獲得下一個進程的控制代碼的函數
CloseToolhelp32Snapshot: 關閉快照
PROCESSENTRY32:用來存放快照進程資訊的一個結構體
有關以上函數的具體用法可以查MSDN
class Process<br /> {<br /> private string processName;<br /> private uint processId;<br /> private int threadCount;<br /> public Process()<br /> { </p><p> }</p><p> private Process(UInt32 processId, string processName,int threadCount)<br /> {<br /> this.processId = processId;<br /> this.processName = processName;<br /> this.threadCount = threadCount;<br /> }</p><p> public override string ToString()<br /> {<br /> return processName;<br /> }</p><p> public uint ProcessId<br /> {<br /> get { return processId; }<br /> }</p><p> public string ProcessName<br /> {<br /> get { return processName; }<br /> }</p><p> public int ThreadCount<br /> {<br /> get { return threadCount; }<br /> }</p><p> public static Process[] GetProcesses() //得到當前的進程資訊表<br /> {<br /> ArrayList procList = new ArrayList();<br /> IntPtr handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0);<br /> int n=0;<br /> if ((int)handle > 0)<br /> {<br /> try<br /> {<br /> PROCESSENTRY32 peCurrent;<br /> PROCESSENTRY32 pe32 = new PROCESSENTRY32();<br /> byte[] peBytes = pe32.ToByteArray();<br /> int retval = Process32First(handle, peBytes);</p><p> while (retval == 1)<br /> {<br /> peCurrent = new PROCESSENTRY32(peBytes);<br /> peCurrent.szExeFile = peCurrent.szExeFile.Replace("/0", "");</p><p> Process proc = new Process(((UInt32)peCurrent.PID), peCurrent.szExeFile, (int)peCurrent.ThreadCount);<br /> procList.Add(proc);</p><p> retval = Process32Next(handle, peBytes);<br /> }<br /> }<br /> catch (Exception ex)<br /> {<br /> throw new Exception("Exception: " + ex.Message);<br /> }<br /> CloseToolhelp32Snapshot(handle);<br /> return (Process[])procList.ToArray(typeof(Process));<br /> }<br /> else<br /> {<br /> throw new Exception("Unable to get process");<br /> }<br /> }</p><p> public class PROCESSENTRY32<br /> {<br /> private const int SizeOffset = 0;<br /> private const int UsageOffset = 4;<br /> private const int ProcessIDOffset = 8;<br /> private const int DefaultHeapIDOffset = 12;<br /> private const int ModuleIDOffset = 16;<br /> private const int ThreadsOffset = 20;<br /> private const int ParentProcessIDOffset = 24;<br /> private const int PriClassBaseOffset = 28;<br /> private const int dwFlagsOffset = 32;<br /> private const int ExeFileOffset = 36;<br /> private const int MemoryBaseOffset = 556;<br /> private const int AccessKeyOffset = 560;<br /> private const int Size = 564;<br /> private const int MAX_PATH = 260;</p><p> public uint dwSize;<br /> public uint cntUsage;<br /> public uint th32ProcessID;<br /> public uint th32DefaultHeapID;<br /> public uint th32ModuleID;<br /> public uint cntThreads;<br /> public uint th32ParentProcessID;<br /> public long pcPriClassBase;<br /> public uint dwFlags;<br /> public string szExeFile;<br /> public uint th32MemoryBase;<br /> public uint th32AccessKey;</p><p> public PROCESSENTRY32()<br /> {<br /> }</p><p> public PROCESSENTRY32(byte[] aData)<br /> {<br /> dwSize = GetUInt(aData, SizeOffset);<br /> cntUsage = GetUInt(aData, UsageOffset);<br /> th32ProcessID = GetUInt(aData, ProcessIDOffset);<br /> th32DefaultHeapID = GetUInt(aData, DefaultHeapIDOffset);<br /> th32ModuleID = GetUInt(aData, ModuleIDOffset);<br /> cntThreads = GetUInt(aData, ThreadsOffset);<br /> th32ParentProcessID = GetUInt(aData, ParentProcessIDOffset);<br /> pcPriClassBase = (long)GetUInt(aData, PriClassBaseOffset);<br /> dwFlags = GetUInt(aData, dwFlagsOffset);<br /> szExeFile = GetString(aData, ExeFileOffset, MAX_PATH);<br /> th32MemoryBase = GetUInt(aData, MemoryBaseOffset);<br /> th32AccessKey = GetUInt(aData, AccessKeyOffset);<br /> }</p><p> #region Conversion functions<br /> private static uint GetUInt(byte[] aData, int Offset)<br /> {<br /> return BitConverter.ToUInt32(aData, Offset);<br /> }</p><p> private static void SetUInt(byte[] aData, int Offset, int Value)<br /> {<br /> byte[] buint = BitConverter.GetBytes(Value);<br /> Buffer.BlockCopy(buint, 0, aData, Offset, buint.Length);<br /> }</p><p> private static ushort GetUShort(byte[] aData, int Offset)<br /> {<br /> return BitConverter.ToUInt16(aData, Offset);<br /> }</p><p> private static void SetUShort(byte[] aData, int Offset, int Value)<br /> {<br /> byte[] bushort = BitConverter.GetBytes((short)Value);<br /> Buffer.BlockCopy(bushort, 0, aData, Offset, bushort.Length);<br /> }</p><p> private static string GetString(byte[] aData, int Offset, int Length)<br /> {<br /> String sReturn = Encoding.Unicode.GetString(aData, Offset, Length);<br /> return sReturn;<br /> }</p><p> private static void SetString(byte[] aData, int Offset, string Value)<br /> {<br /> byte[] arr = Encoding.ASCII.GetBytes(Value);<br /> Buffer.BlockCopy(arr, 0, aData, Offset, arr.Length);<br /> }<br /> #endregion</p><p> public byte[] ToByteArray()<br /> {<br /> byte[] aData;<br /> aData = new byte[Size];<br /> SetUInt(aData, SizeOffset, Size);<br /> return aData;<br /> }</p><p> public string Name<br /> {<br /> get { return szExeFile.Substring(0, szExeFile.IndexOf('/0')); }<br /> }</p><p> public ulong PID<br /> {<br /> get { return th32ProcessID; }<br /> }</p><p> public ulong BaseAddress<br /> {<br /> get { return th32MemoryBase; }<br /> }</p><p> public ulong ThreadCount<br /> {<br /> get { return cntThreads; }<br /> }<br /> }</p><p> private const int TH32CS_SNAPPROCESS = 0x00000002;<br /> private const int TH32CS_SNAPNOHEAPS = 0x40000000;</p><p> [DllImport("toolhelp.dll")]<br /> public static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processid);<br /> [DllImport("toolhelp.dll")]<br /> public static extern int CloseToolhelp32Snapshot(IntPtr handle);<br /> [DllImport("toolhelp.dll")]<br /> public static extern int Process32First(IntPtr handle, byte[] pe);<br /> [DllImport("toolhelp.dll")]<br /> public static extern int Process32Next(IntPtr handle, byte[] pe);</p><p> }
最後不要忘了DllImport,因為上面的這些函數並不是C#中本身有的api