windows mobile進程查看器開發(一)——獲得當前運行進程的資訊

來源:互聯網
上載者:User

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.