Demo:Windows Mobile 6.5 进程管理
[CODE]//------------------------------------------------------------------------
// <copyright file="ProcessInfo.cs" company="Yaping Xin">
// Copyright (c) Yaping Xin. All rights reserved.
// </copyright>
// <Description>Process management.</Description>
//------------------------------------------------------------------------
namespace MobileAutomation.PhoneCore.Common
{
using System;
using System.Collections;
using MobileAutomation.PhoneCore.NativeMethods;
using MobileAutomation.PhoneCore.NativeStructures;
/// <summary>
/// Description for Process.
/// </summary>
public class ProcessInfo
{
#region Private Data Members
/// <summary>Process Name</summary>
private string processName;
/// <summary>Process handle</summary>
private IntPtr handle;
/// <summary>Process thread count</summary>
private int threadCount;
/// <summary>Process base address</summary>
private int baseAddress;
#endregion
#region Initialization
/// <summary>
/// Initializes a new instance of the ProcessInfo class.
/// </summary>
public ProcessInfo()
{
}
/// <summary>
/// Initializes a new instance of the ProcessInfo class with parameters.
/// </summary>
/// <param name="handle">Process handle</param>
/// <param name="processName">Process Name</param>
/// <param name="threadCount">Process thread count</param>
/// <param name="baseAddress">Process base address</param>
public ProcessInfo(IntPtr handle, string processName, int threadCount, int baseAddress)
{
this.handle = handle;
this.processName = processName;
this.threadCount = threadCount;
this.baseAddress = baseAddress;
}
#endregion
#region Public Properties
/// <summary>
/// Gets Process Name property
/// </summary>
public string ProcessName
{
get { return this.processName; }
}
/// <summary>
/// Gets Base Address property
/// </summary>
public int BaseAddress
{
get { return this.baseAddress; }
}
/// <summary>
/// Gets Thread Count property
/// </summary>
public int ThreadCount
{
get { return this.threadCount; }
}
/// <summary>
/// Gets Handle property
/// </summary>
public IntPtr Handle
{
get { return this.handle; }
}
#endregion
#region Public Methods
/// <summary>
/// Gets process list
/// </summary>
/// <returns>process list</returns>
public static ProcessInfo[] GetProcesses()
{
ArrayList processList = new ArrayList();
IntPtr handle = ToolHelp.CreateToolhelp32Snapshot((uint)(TH32CS.SnapProcess | TH32CS.SnapNoHeaps), 0);
if ((int)handle > 0)
{
try
{
ProcessEntry32 current;
ProcessEntry32 processEntry32 = new ProcessEntry32();
// Get byte array to pass to the API calls
byte[] bytes = processEntry32.ToByteArray();
// Get the first process
int retval = ToolHelp.Process32First(handle, bytes);
while (retval == 1)
{
// Convert bytes to the class
current = new ProcessEntry32(bytes);
// New instance
ProcessInfo proc = new ProcessInfo(new IntPtr((int)current.PID), current.Name, (int)current.ThreadCount, (int)current.BaseAddress);
processList.Add(proc);
retval = ToolHelp.Process32Next(handle, bytes);
}
}
catch (Exception e)
{
throw new Exception("Exception in creating process list: " + e.Message);
}
ToolHelp.CloseToolhelp32Snapshot(handle);
return (ProcessInfo[])processList.ToArray(typeof(ProcessInfo));
}
else
{
throw new Exception("Cannot create snapshot using toolhelp.dll");
}
}
/// <summary>
/// ToString() implementation.
/// </summary>
/// <returns>ToString() value</returns>
public override string ToString()
{
return this.ProcessName;
}
/// <summary>
/// Kill the process
/// </summary>
public void Kill()
{
IntPtr process;
process = CoreDll.OpenProcess(CoreDll.ProcessTerminate, false, (int)this.Handle);
if (process != (IntPtr)CoreDll.InvalidHandleValue)
{
CoreDll.TerminateProcess(process, 0);
CoreDll.CloseHandle(process);
}
}
#endregion
}
}[/CODE]