您的位置:首页 > 其它

在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序

2009-01-13 07:21 1101 查看
在.NET Compact Framework 的进程管理需要调用win32的API,也就是P/Invoke,在msnd上提供了这一P/Invoke的源代码, Creating a Microsoft .NET Compact Framework-based Process Manager Application,由于在技术交流群里有不同的人问同样的问题,因此打算写一下。

Win32 API

关键的API 如下:

   private const int TH32CS_SNAPPROCESS = 0x00000002;
[DllImport("toolhelp.dll")]
public static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processid);
[DllImport("toolhelp.dll")]
public static extern int CloseToolhelp32Snapshot(IntPtr handle);
[DllImport("toolhelp.dll")]
public static extern int Process32First(IntPtr handle, byte[] pe);
[DllImport("toolhelp.dll")]
public static extern int Process32Next(IntPtr handle, byte[] pe);
[DllImport("coredll.dll")]
private static extern IntPtr OpenProcess(int flags, bool fInherit, int PID);
private const int PROCESS_TERMINATE = 1;
[DllImport("coredll.dll")]
private static extern bool TerminateProcess(IntPtr hProcess, uint ExitCode);
[DllImport("coredll.dll")]
private static extern bool CloseHandle(IntPtr handle);
private const int INVALID_HANDLE_VALUE = -1;
调用上面的API就能就能轮询出所有的进程,可以杀死指定进程了。

Structures

调用这些API需要下面的结构体 PROCESSENTRY32,结构体的转换是P/Invoke里面最难的部分,我曾经写过一篇这样的文章(.NET Compact Framework 下Win32 API P/Invoke 的使用),还是有很多需要学习和改进的地方,欢迎指教。

Process class
#region Process class
/// <summary>
/// Summary description for Process.
/// </summary>
public class Process
{
private string processName;
private IntPtr handle;
private int threadCount;
private int baseAddress;

//default constructor
public Process()
{

}

private Process(IntPtr id, string procname, int threadcount, int baseaddress)
{
handle = id;
processName = procname;
threadCount = threadcount;
baseAddress = baseaddress;
}

//ToString implementation for ListBox binding
public override string ToString()
{
return processName;
}

public int BaseAddress
{
get
{
return baseAddress;
}
}

public int ThreadCount
{
get
{
return threadCount;
}
}

public IntPtr Handle
{
get
{
return handle;
}
}

public string ProcessName
{
get
{
return processName;
}
}

public int BaseAddess
{
get
{
return baseAddress;
}
}

public void Kill()
{
IntPtr hProcess;

hProcess = OpenProcess(PROCESS_TERMINATE, false, (int) handle);

if(hProcess != (IntPtr) INVALID_HANDLE_VALUE)
{
bool bRet;
bRet = TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}

}

public static Process[] GetProcesses()
{
ArrayList procList = new ArrayList();

IntPtr handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if ((int)handle > 0)
{
try
{
PROCESSENTRY32 peCurrent;
PROCESSENTRY32 pe32 = new PROCESSENTRY32();
//Get byte array to pass to the API calls
byte[] peBytes = pe32.ToByteArray();
//Get the first process
int retval = Process32First(handle, peBytes);

while(retval == 1)
{
//Convert bytes to the class
peCurrent = new PROCESSENTRY32(peBytes);
//New instance
Process proc = new Process(new IntPtr((int)peCurrent.PID), peCurrent.Name, (int)peCurrent.ThreadCount, (int)peCurrent.BaseAddress);

procList.Add(proc);

retval = Process32Next(handle, peBytes);
}
}
catch(Exception ex)
{
throw new Exception("Exception: " + ex.Message);
}

//Close handle
CloseToolhelp32Snapshot(handle);

return (Process[])procList.ToArray(typeof(Process));

}
else
{
throw new Exception("Unable to create snapshot");
}

}

#endregion

Client

static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("Please enter the process name.");
return;
}
string processName = args[0].ToUpper() + ".EXE";

Process[] processes = Process.GetProcesses();
foreach (Process proc in processes)
{
if (proc.ProcessName.ToUpper() == processName)
{
proc.Kill();
Console.WriteLine("{0} was killed.", processName);
break;
}
}
}
这是一个简单的杀进程例子,要取出进程信息,读Process 的attribute就可以了,十分简单。

参考文献

Creating a Microsoft .NET Compact Framework-based Process Manager Application

上述代码来源于msnd,msnd的源代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐