C#進程死亡
回答
首先搜索所有進程要殺死,比殺了它的進程。
Process[] runningProcesses = Process.GetProcesses();
foreach (Process process in runningProcesses)
{
// now check the modules of the process
foreach (ProcessModule module in process.Modules)
{
if (module.FileName.Equals("MyProcess.exe"))
{
process.Kill();
}
}
}
如果您已經知道進程名稱,則不需要循環所有進程。查看@ SwDevMan81發佈的答案。 –
據說他知道exe的路徑,而不知道進程的名稱。否則,你是絕對正確的。 –
即使您知道該名稱,如果有多個實例正在運行,該怎麼辦?或者如果兩個不同的程序具有相同的名稱? –
您可以通過使用Process Class類來實現它,但您爲什麼要殺死另一個進程?
Process類具有殺()方法
可以調用Process.Kill方法
可以使用Process.GetProcesses來獲取所有流程或Process.GetProcessByName或Process.GetProcessById這樣你就可以得到進程調用殺死。
退房Process.GetProcessesByName和Process.Kill
// Get all instances of Notepad running on the local
// computer.
Process [] localByName = Process.GetProcessesByName("notepad");
foreach(Process p in localByName)
{
p.Kill();
}
由他們的名字殺死進程可以很容易地在C#中完成(因爲其他答案已經完美顯示)。如果你想要基於可執行文件的完整路徑殺死進程,事情會變得更加棘手。一種方法是使用WMI,另一種方法是使用Windows API函數Module32First
。
下面的示例使用後一種方法。它首先按名稱選擇正在運行的進程的子集,然後查詢每個進程的完整可執行文件路徑。請注意,此路徑將是正在執行的映像的實際路徑,這不一定是已啓動的可執行文件(例如,在x64系統上,calc.exe的實際路徑將爲C:\ Windows \ SysWOW64 \ calc.exe,即使文件C:\ Windows \ system32 \ calc.exe已啓動)。匹配路徑的所有過程都是由GetProcessesByPath
返回:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
class Program
{
static void Main(string[] args)
{
Process[] processList = GetProcessesByPath(@"C:\Program Files\MyCalculator\calc.exe");
foreach (var process in processList)
{
if (!process.HasExited)
process.Kill();
}
}
static Process[] GetProcessesByPath(string path)
{
List<Process> result = new List<Process>();
string processName = Path.GetFileNameWithoutExtension(path);
foreach (var process in Process.GetProcessesByName(processName))
{
ToolHelpHandle hModuleSnap = NativeMethods.CreateToolhelp32Snapshot(NativeMethods.SnapshotFlags.Module, (uint)process.Id);
if (!hModuleSnap.IsInvalid)
{
NativeMethods.MODULEENTRY32 me32 = new NativeMethods.MODULEENTRY32();
me32.dwSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(me32);
if (NativeMethods.Module32First(hModuleSnap, ref me32))
{
if (me32.szExePath == path)
{
result.Add(process);
}
}
hModuleSnap.Close();
}
}
return result.ToArray();
}
}
//
// The safe handle class is used to safely encapsulate win32 handles below
//
public class ToolHelpHandle : SafeHandleZeroOrMinusOneIsInvalid
{
private ToolHelpHandle()
: base(true)
{
}
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
protected override bool ReleaseHandle()
{
return NativeMethods.CloseHandle(handle);
}
}
//
// The following p/invoke wrappers are used to get the list of process and modules
// running inside each process.
//
public class NativeMethods
{
[DllImport("kernel32.dll", SetLastError = true)]
static public extern bool CloseHandle(IntPtr hHandle);
[DllImport("kernel32.dll")]
static public extern bool Module32First(ToolHelpHandle hSnapshot, ref MODULEENTRY32 lpme);
[DllImport("kernel32.dll")]
static public extern bool Module32Next(ToolHelpHandle hSnapshot, ref MODULEENTRY32 lpme);
[DllImport("kernel32.dll")]
static public extern bool Process32First(ToolHelpHandle hSnapshot, ref PROCESSENTRY32 lppe);
[DllImport("kernel32.dll")]
static public extern bool Process32Next(ToolHelpHandle hSnapshot, ref PROCESSENTRY32 lppe);
[DllImport("kernel32.dll", SetLastError = true)]
static public extern ToolHelpHandle CreateToolhelp32Snapshot(SnapshotFlags dwFlags, uint th32ProcessID);
public const short INVALID_HANDLE_VALUE = -1;
[Flags]
public enum SnapshotFlags : uint
{
HeapList = 0x00000001,
Process = 0x00000002,
Thread = 0x00000004,
Module = 0x00000008,
Module32 = 0x00000010,
Inherit = 0x80000000,
All = 0x0000001F
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct PROCESSENTRY32
{
public uint dwSize;
public uint cntUsage;
public uint th32ProcessID;
public IntPtr th32DefaultHeapID;
public uint th32ModuleID;
public uint cntThreads;
public uint th32ParentProcessID;
public int pcPriClassBase;
public uint dwFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szExeFile;
};
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct MODULEENTRY32
{
public uint dwSize;
public uint th32ModuleID;
public uint th32ProcessID;
public uint GlblcntUsage;
public uint ProccntUsage;
IntPtr modBaseAddr;
public uint modBaseSize;
IntPtr hModule;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string szModule;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szExePath;
};
}
某些代碼是基於由Jason Zander的文章可以發現here。
Process[] processes = Process.GetProcesses();
foreach (Process pr in processes){
if (pr.ProcessName=="vfp")
if (pr.MainWindowTitle.Contains("test"))
pr.CloseMainWindow();
}`enter code here`
這裏vfp是進程名稱。並測試是安裝標題名稱。
我想定義我自己的應用程序列表來關閉,所以我根據我見過的一些示例進行了設置。它簡單而有效。
string[] Process_name_list = {"chrome","notepad"};
foreach (string Process_name in Process_name_list)
{
foreach (var process in Process.GetProcessesByName(Process_name))
{
process.Kill();
}
}
- 1. Yaws進程死亡
- 2. Hadoop:Datanode進程死亡
- 3. 獲取node.js進程死亡?
- 4. 進程已經死亡
- 5. 進程死亡本身
- 6. Java進程如何死亡?
- 7. Apache/WSGI進程死亡
- 8. perl:當主進程死亡時線程不會死亡
- 9. C++程序意外死亡
- 10. android遠程進程(receiver)快速死亡
- 11. ActivityManager進程已經死亡問題
- 12. Android進程已經死亡後背景
- 13. 確保子進程在Cocoa中死亡
- 14. SQLAlchemy - 插入> 1M行 - 進程死亡
- 15. 進程死亡 - 刪除輸出文件?
- 16. Node.js進程在aws實例上死亡
- 17. 追蹤子進程的死亡
- 18. 如何知道進程是否死亡
- 19. 當python進程死亡時運行atexit()
- 20. Nohup java進程超時或死亡
- 21. node.js進程何時意外死亡?
- 22. Supervisord不會啓動死亡進程
- 23. Shell腳本進程自動死亡
- 24. -9中止死亡的進程?
- 25. Docker進程死亡與'神祕'消息
- 26. Jsch退出後進程死亡
- 27. IPC:共享內存死亡進程notfication
- 28. c程序作爲背景運行進程,永不死亡?
- 29. Java線程死亡
- 30. 當應用程序死亡時殺死外部進程
「數字謀殺,機器語言」 –