瑞雪年

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::

当wm下GetProcesses不好用了,要杀特定的进程就只能通过窗体的标题了:

代码

        
public bool KillProcessByWindowsTitle(string title)
        {
            IntPtr hWnd 
= SafeNativeMethods.FindWindow(null, title);
            
if (hWnd != IntPtr.Zero)
            {
                
int processId = 0;
                SafeNativeMethods.GetWindowThreadProcessId(hWnd, 
ref processId);
                IntPtr hProcess 
= IntPtr.Zero;
                hProcess 
= SafeNativeMethods.OpenProcess(SafeNativeMethods.PROCESS_ALL_ACCESS, 0, processId);
                
if (hProcess != IntPtr.Zero)
                {
                    
if (SafeNativeMethods.TerminateProcess(hProcess, 1))
                    {
                        SafeNativeMethods.CloseHandle(hProcess);
                        
return true;
                    }
                    
else
                    {
                        SafeNativeMethods.CloseHandle(hProcess);
                        
return false;
                    }
                }
                
else
                {
                    
return false;
                }
            }
            
return false;
        }



        
internal sealed class SafeNativeMethods
        {
            [DllImport(
"coredll.dll")]
            
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

            
public const int PROCESS_ALL_ACCESS = 0x000F0000 | 0x00100000 | 0xFFF;
            [DllImport(
"coredll.dll")]
            
public extern static int GetWindowThreadProcessId(IntPtr hWnd, ref int lpdwProcessId);
            [DllImport(
"coredll.dll")]
            
public extern static IntPtr OpenProcess(int fdwAccess, int fInherit, int IDProcess);
            [DllImport(
"coredll.dll")]
            
public extern static bool TerminateProcess(IntPtr hProcess, int uExitCode);
            [DllImport(
"coredll.dll")]
            
public extern static bool CloseHandle(IntPtr hObject);
        }


 但,也许大部分设备上,GetProcesses是好用的(我比较倾向认为我点儿背。)

代码
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Text;

namespace Mobile
{
    
/// <summary>
    
/// Summary description for Process.
    
/// </summary>
    public class Process
    {
        
#region Process class
        
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");
                return null;
            }
        }

        
#endregion

        
#region PROCESSENTRY32 implementation

        
private class PROCESSENTRY32
        {
            
// constants for structure definition
            private const int SizeOffset = 0;
            
private const int UsageOffset = 4;
            
private const int ProcessIDOffset = 8;
            
private const int DefaultHeapIDOffset = 12;
            
private const int ModuleIDOffset = 16;
            
private const int ThreadsOffset = 20;
            
private const int ParentProcessIDOffset = 24;
            
private const int PriClassBaseOffset = 28;
            
private const int dwFlagsOffset = 32;
            
private const int ExeFileOffset = 36;
            
private const int MemoryBaseOffset = 556;
            
private const int AccessKeyOffset = 560;
            
private const int Size = 564;
            
private const int MAX_PATH = 260;

            
// data members
            public uint dwSize;
            
public uint cntUsage;
            
public uint th32ProcessID;
            
public uint th32DefaultHeapID;
            
public uint th32ModuleID;
            
public uint cntThreads;
            
public uint th32ParentProcessID;
            
public long pcPriClassBase;
            
public uint dwFlags;
            
public string szExeFile;
            
public uint th32MemoryBase;
            
public uint th32AccessKey;

            
//Default constructor
            public PROCESSENTRY32()
            {


            }

            
// create a PROCESSENTRY instance based on a byte array        
            public PROCESSENTRY32(byte[] aData)
            {
                dwSize 
= GetUInt(aData, SizeOffset);
                cntUsage 
= GetUInt(aData, UsageOffset);
                th32ProcessID 
= GetUInt(aData, ProcessIDOffset);
                th32DefaultHeapID 
= GetUInt(aData, DefaultHeapIDOffset);
                th32ModuleID 
= GetUInt(aData, ModuleIDOffset);
                cntThreads 
= GetUInt(aData, ThreadsOffset);
                th32ParentProcessID 
= GetUInt(aData, ParentProcessIDOffset);
                pcPriClassBase 
= (long)GetUInt(aData, PriClassBaseOffset);
                dwFlags 
= GetUInt(aData, dwFlagsOffset);
                szExeFile 
= GetString(aData, ExeFileOffset, MAX_PATH);
                th32MemoryBase 
= GetUInt(aData, MemoryBaseOffset);
                th32AccessKey 
= GetUInt(aData, AccessKeyOffset);
            }

            
#region Helper conversion functions
            
// utility:  get a uint from the byte array
            private static uint GetUInt(byte[] aData, int Offset)
            {
                
return BitConverter.ToUInt32(aData, Offset);
            }

            
// utility:  set a uint int the byte array
            private static void SetUInt(byte[] aData, int Offset, int Value)
            {
                
byte[] buint = BitConverter.GetBytes(Value);
                Buffer.BlockCopy(buint, 
0, aData, Offset, buint.Length);
            }

            
// utility:  get a ushort from the byte array
            private static ushort GetUShort(byte[] aData, int Offset)
            {
                
return BitConverter.ToUInt16(aData, Offset);
            }

            
// utility:  set a ushort int the byte array
            private static void SetUShort(byte[] aData, int Offset, int Value)
            {
                
byte[] bushort = BitConverter.GetBytes((short)Value);
                Buffer.BlockCopy(bushort, 
0, aData, Offset, bushort.Length);
            }

            
// utility:  get a unicode string from the byte array
            private static string GetString(byte[] aData, int Offset, int Length)
            {
                String sReturn 
= Encoding.Unicode.GetString(aData, Offset, Length);
                
return sReturn;
            }

            
// utility:  set a unicode string in the byte array
            private static void SetString(byte[] aData, int Offset, string Value)
            {
                
byte[] arr = Encoding.ASCII.GetBytes(Value);
                Buffer.BlockCopy(arr, 
0, aData, Offset, arr.Length);
            }
            
#endregion

            
// create an initialized data array
            public byte[] ToByteArray()
            {
                
byte[] aData;
                aData 
= new byte[Size];
                
//set the Size member
                SetUInt(aData, SizeOffset, Size);
                
return aData;
            }

            
public string Name
            {
                
get
                {
                    
return szExeFile.Substring(0, szExeFile.IndexOf('\0'));
                }
            }

            
public ulong PID
            {
                
get
                {
                    
return th32ProcessID;
                }
            }

            
public ulong BaseAddress
            {
                
get
                {
                    
return th32MemoryBase;
                }
            }

            
public ulong ThreadCount
            {
                
get
                {
                    
return cntThreads;
                }
            }
        }
        
#endregion

        
#region PInvoke declarations
        
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;

        
#endregion
    }
}



posted on 2010-01-08 15:14  瑞雪年  阅读(612)  评论(2编辑  收藏  举报