【c#】关于终止以及删除主进程创建的线程以及进程的方法
2015-08-27 13:38
603 查看
今天在开发一款工具软件的时候,出现了一个问题:c#在Start新的Process之后,主动关闭窗口,在进程中发现窗口创建的另一个应用进程的优先级变为了主进程,导致了重启工具的时候,无法通过Process新建新的子进程,顺便再填上一个由主进程创建Thread线程之后,导致的关闭窗口,线程升级为进程的问题。
首先,先截取Frame窗口的关闭事件,将关闭方法写在里面:
如果在64位程序上无效的话,可是试试这个:
static void KillProcessAndChildren(int pid)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
}
try
{
Process proc = Process.GetProcessById(pid);
Console.WriteLine(pid);
proc.Kill();
}
catch (ArgumentException)
{
/* process already exited */
}
}
首先,先截取Frame窗口的关闭事件,将关闭方法写在里面:
private int WM_SYSCOMMAND = 0x112; private long SC_MAXIMIZE = 0xF030; private long SC_MINIMIZE = 0xF020; private long SC_CLOSE = 0xF060; protected override void WndProc(ref Message m) {//拦截事件使用 if (m.Msg == WM_SYSCOMMAND) { if (m.WParam.ToInt64() == SC_MAXIMIZE) { } if (m.WParam.ToInt64() == SC_MINIMIZE) { } if (m.WParam.ToInt64() == SC_CLOSE) { Trace.WriteLine("点击了关闭按钮"); ProcessExtend.KillProcessTree(Process.GetCurrentProcess());//可关闭进程 Process.GetCurrentProcess().Kill();//可关闭线程 } } base.WndProc(ref m); }关闭线程很简单,只需要调用Process.GetCurrentProcess().Kill();就可以;关闭相关的子进程有点复杂,需要从进程树里挨个停止以及杀掉,在网上查找资料,发现可以直接写一个工具类,静态调用:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace DsidealAssistant.Tools { static class ProcessExtend { private struct ProcessBasicInformation { public int ExitStatus; public int PebBaseAddress; public int AffinityMask; public int BasePriority; public uint UniqueProcessId; public uint InheritedFromUniqueProcessId; } [DllImport("ntdll.dll")] static extern int NtQueryInformationProcess( IntPtr hProcess, int processInformationClass, ref ProcessBasicInformation processBasicInformation, uint processInformationLength, out uint returnLength ); public static void KillProcessTree(this Process parent) { var processes = Process.GetProcesses(); foreach (var p in processes) { var pbi = new ProcessBasicInformation(); try { uint bytesWritten; if (NtQueryInformationProcess(p.Handle, 0, ref pbi, (uint)Marshal.SizeOf(pbi), out bytesWritten) == 0) if (pbi.InheritedFromUniqueProcessId == parent.Id) using (var newParent = Process.GetProcessById((int)pbi.UniqueProcessId)) newParent.KillProcessTree(); } catch { } } parent.Kill(); } } }
如果在64位程序上无效的话,可是试试这个:
static void KillProcessAndChildren(int pid)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
}
try
{
Process proc = Process.GetProcessById(pid);
Console.WriteLine(pid);
proc.Kill();
}
catch (ArgumentException)
{
/* process already exited */
}
}
相关文章推荐
- c#调用COM组件
- 100 个最佳 Ubuntu 应用(中)
- 在 AppImage、Flathub 和 Snapcraft 平台上搜索 Linux 应用
- 24 个必备的 Linux 应用程序
- 注册表趣味应用小集
- 远程控制技术的应用
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- 路由器访问列表的应用
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- xDSL技术及其应用
- C#中尾递归的使用、优化及编译器优化
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析