版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序在.NET Compact Framework 的进程管理需要调用win32的API,也就是P/Invoke,在msnd上提供了这一P/Invoke的源代码, Creating a Microsoft .NET Compact Framework-based Process Manager Application,由于在技术交流群里有不同的人问同样的问题,因此打算写一下。Win32 API关键的API 如下:private
2、;const int TH32CS_SNAPPROCESS = 0x00000002; DllImport("toolhelp.dll") public static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint p
3、rocessid); DllImport("toolhelp.dll") public static extern int CloseToolhelp32Snapshot(IntPtr handle); DllImport("toolhe
4、lp.dll") public static extern int Process32First(IntPtr handle, byte pe); DllImport("toolhelp.dll") public
5、60;static extern int Process32Next(IntPtr handle, byte pe); DllImport("coredll.dll") private static extern IntPtr OpenProcess(int flags,
6、;bool fInherit, int PID); private const int PROCESS_TERMINATE = 1; DllImport("coredll.dll") private stat
7、ic extern bool TerminateProcess(IntPtr hProcess, uint ExitCode); DllImport("coredll.dll") private static extern bool CloseHandle(IntPtr handl
8、e); private const int INVALID_HANDLE_VALUE = -1;调用上面的API就能就能轮询出所有的进程,可以杀死指定进程了。 Structures调用这些API需要下面的结构体 PROCESSENTRY32,结构体的转换是P/Invoke里面最难的部分,我曾经写过一篇这样的文章(.NET Compact Framework 下Win32 API P/Invoke 的使用),还是有很多需要学习和改进的地方,欢迎
9、指教。 #region PROCESSENTRY32 implementation/ typedef struct tagPROCESSENTRY32 / / DWORD dwSize;&
10、#160;/ DWORD cntUsage; / DWORD th32ProcessID; / DWORD th32Defa
11、ultHeapID; / DWORD th32ModuleID; / DWORD cntThreads; / DWORD
12、160;th32ParentProcessID; / LONG pcPriClassBase; / DWORD dwFlags; / &
13、#160;TCHAR szExeFileMAX_PATH; / DWORD th32MemoryBase;/ DWORD th32AccessKey;/ PROCESSE
14、NTRY32; private class PROCESSENTRY32 / constants for structure definition &
15、#160; private const int SizeOffset = 0; private const int UsageOffset = 4;
16、0;private const int ProcessIDOffset=8; private const int DefaultHeapIDOffset = 12; private const int Mo
17、duleIDOffset = 16; private const int ThreadsOffset = 20; private const int ParentProcessIDOffset =
18、;24; private const int PriClassBaseOffset = 28; private const int dwFlagsOffset = 32;
19、; private const int ExeFileOffset = 36; private const int MemoryBaseOffset = 556;
20、60; private const int AccessKeyOffset = 560; private const int Size = 564; private con
21、st int MAX_PATH = 260; / data members public uint dwSize; &
22、#160; public uint cntUsage; public uint th32ProcessID; public uint th32DefaultHeapID;
23、160; public uint th32ModuleID; public uint cntThreads; public uint
24、160;th32ParentProcessID; public long pcPriClassBase; public uint dwFlags;
25、; public string szExeFile; public uint th32MemoryBase; public uint th32AccessKey;
26、 /Default constructor public PROCESSENTRY32() &
27、#160; / create a PROCESSENTRY instance based on a byte array
28、0; public PROCESSENTRY32(byte aData) dwSize = GetUInt(aData,
29、 SizeOffset); cntUsage = GetUInt(aData, UsageOffset); th32ProcessID = GetUInt(aD
30、ata, ProcessIDOffset); th32DefaultHeapID = GetUInt(aData, DefaultHeapIDOffset); th32Module
31、ID = GetUInt(aData, ModuleIDOffset); cntThreads = GetUInt(aData, ThreadsOffset);
32、;th32ParentProcessID = GetUInt(aData, ParentProcessIDOffset); pcPriClassBase = (long) GetUInt(aData, PriClassBaseOffset); &
33、#160; dwFlags = GetUInt(aData, dwFlagsOffset); szExeFile = GetString(aData, ExeFileOffset, MAX_PATH);
34、0; th32MemoryBase = GetUInt(aData, MemoryBaseOffset); th32AccessKey = GetUInt(aData, AccessKeyOffset);
35、160; #region Helper conversion functions / utility: get a
36、;uint from the byte array private static uint GetUInt(byte aData, int Offset)
37、 return BitConverter.ToUInt32(aData, Offset);
38、 / utility: set a uint int the byte array private static void SetUInt(byte aData, int Offset, int Value)
39、0; byte buint = BitConverter.GetBytes(Value); Buffer.
40、BlockCopy(buint, 0, aData, Offset, buint.Length); / utility: get a ushort from the byte arr
41、ay private static ushort GetUShort(byte aData, int Offset)
42、60; return BitConverter.ToUInt16(aData, Offset); / utility:
43、set a ushort int the byte array private static void SetUShort(byte aData, int Offset, int Value)
44、60; byte bushort = BitConverter.GetBytes(short)Value); Buffer.BlockCopy(bushort, 0,&
45、#160;aData, Offset, bushort.Length); / utility: get a unicode string
46、 from the byte array private static string GetString(byte aData, int Offset, int Length)
47、60; String sReturn = Encoding.Unicode.GetString(aData, Offset, Length); return sReturn
48、; / utility: set a unicode string in the byte array &
49、#160; private static void SetString(byte aData, int Offset, string Value)
50、160; byte arr = Encoding.ASCII.GetBytes(Value); Buffer.BlockCopy(arr, 0, aData, Offset, arr.Length);
51、; #endregion / create an initialized data array
52、160; public byte ToByteArray() byte aData;
53、; aData = new byteSize; /set the Size member
54、SetUInt(aData, SizeOffset, Size); return aData;
55、;public string Name get
56、0; return szExeFile.Substring(0, szExeFile.IndexOf('0');
57、; public ulong PID
58、60; get return th32ProcessID;
59、0; public ulong BaseAddress
60、 get
61、60; return th32MemoryBase; public
62、 ulong ThreadCount get
63、; return cntThreads;
64、 #endregionWrapped Class #region Process class / <summary> / Summary description for Process.
65、160; / </summary> public class Process private string processName; private IntPtr handle;
66、 private int threadCount; private int baseAddress; /default constructor
67、60; public Process() private Process(IntPtr id, string
68、procname, int threadcount, int baseaddress) handle = id;
69、;processName = procname; threadCount = threadcount; baseAddress = baseaddress;
70、160; /ToString implementation for ListBox binding public override string ToString()
71、0; return processName; public int BaseAddress ge
72、t return baseAddress;
73、; public int ThreadCount get
74、 return threadCount; public IntPtr
75、Handle get ret
76、urn handle; public string ProcessName
77、60; get return processName;
78、 public int BaseAddess get
79、160; return baseAddress;
80、160; public void Kill() IntPtr hProcess; &
81、#160;hProcess = OpenProcess(PROCESS_TERMINATE, false, (int) handle); if(hProcess != (IntPtr) INVALID_HANDLE_VALUE)
82、60; bool bRet; bRet = TerminateProcess(hProcess, 0);
83、160; CloseHandle(hProcess);
84、0; public static Process GetProcesses() ArrayList procList = new ArrayList();
85、0; IntPtr handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (int)handle > 0)
86、60; try
87、PROCESSENTRY32 peCurrent; PROCESSENTRY32 pe32 = new PROCESSENTRY32();
88、60; /Get byte array to pass to the API calls byte peBytes = pe32.ToByteArray();
89、 /Get the first process int retval = Process32Firs
90、t(handle, peBytes); while(retval = 1)
91、60; /Convert bytes to the class
92、0; peCurrent = new PROCESSENTRY32(peBytes); /New instance
93、60; Process proc = new Process(new IntPtr(int)peCurrent.PID), peCurrent.Name, (int)peCurrent.ThreadCount, (int)peCurrent.BaseAddress); &
94、#160; procList.Add(proc);
95、 retval = Process32Next(handle, peBytes);
96、; catch(Exception ex)
97、; throw new Exception("Exception: " + ex.Message); &
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 奶牛乳房炎防控管理制度
- 儿童青少年营养调理方案
- 印象派色彩理论对现代设计影响机制研究-基于色彩分析与设计史方法结合应用研究
- 消渴护理中的中药应用
- 甲状腺疾病护理的评估方法
- 农机维修保养操作指南
- 2026年安全管理人员新安法培训感悟
- 2026年肿瘤患者安宁疗护服务流程
- 2026年农村中医药防病简便方法
- 2026年燃气发电机组运行维护保养手册
- 湘潭电化科技股份有限公司招聘笔试题库2026
- 2025年福建省泉州市初二地生会考考试真题及答案
- 阿尔茨海默病血液蛋白标志物及其检测技术专家共识(2026版)
- 2025年清远市清新区招聘教师真题
- 分支机构登记(备案)申请书(2026年版)
- 2026年医院财务科人员招聘考试题及答案
- 2026年高考地理一轮复习:40个高频考点答题模板汇编
- TCPIA 0085-2024《废弃晶体硅光伏组件回收的包装、运输、贮存技术规范》
- 2026年国家级生物制造中试平台申报创建指南
- (一模)黄石市2026年全市高三(3月)模拟考试英语试卷(含答案详解)+听力音频+听力原文
- GB/T 47048-2026自然保护地标识通用要求
评论
0/150
提交评论