C# WPF中如何终止OpenFileDialog选中文件对应运行进程
WPF 屏蔽选中程序运行实现方案
核心实现逻辑
要实现选中程序在代码运行期间无法启动,不需要复杂系统钩子,靠两步即可实现:
- 从选中的exe文件路径提取对应进程名(即exe文件名去掉
.exe后缀的部分) - 用轻量定时器高频扫描系统运行进程,发现匹配的进程直接强制终止,用户打开程序的瞬间就会被关闭,达到无法使用的效果。
前置准备
首先在代码文件顶部引入需要的命名空间:
using System.Diagnostics; using System.IO; using System.Windows.Threading;
完整代码实现
首先在窗口类中定义全局变量,存储要屏蔽的进程列表和监控定时器:
// 存储需要屏蔽的进程名(忽略大小写匹配) private readonly HashSet<string> _blockedProcessNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase); // 进程监控定时器 private DispatcherTimer _processMonitorTimer;
在窗口构造函数中初始化定时器,启动监控:
public MainWindow() { InitializeComponent(); // 初始化定时器,每1秒扫描一次进程,平衡响应速度和资源占用 _processMonitorTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; _processMonitorTimer.Tick += ProcessMonitorTimer_Tick; _processMonitorTimer.Start(); }
添加定时器扫描逻辑,每次触发就终止所有在屏蔽列表里的运行中进程:
private void ProcessMonitorTimer_Tick(object sender, EventArgs e) { if (_blockedProcessNames.Count == 0) return; foreach (var processName in _blockedProcessNames) { try { var runningProcesses = Process.GetProcessesByName(processName); foreach (var proc in runningProcesses) { try { proc.Kill(); proc.WaitForExit(1000); } catch { // 忽略权限不足、进程已退出等异常,避免程序崩溃 } finally { proc.Dispose(); } } } catch { // 忽略进程查询异常 } } }
修改原有按钮点击事件,加入选中文件解析、即时终止已运行进程的逻辑:
private void Button_Click(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "可执行文件(*.exe)|*.exe|所有文件(*.*)|*.*"; ofd.Multiselect = true; if (ofd.ShowDialog() == true) { // 清空之前的屏蔽列表,如果要累加屏蔽程序就删掉下面这行 _blockedProcessNames.Clear(); foreach (string filename in ofd.FileNames) { // 只处理exe格式文件 if (!Path.GetExtension(filename).Equals(".exe", StringComparison.OrdinalIgnoreCase)) continue; string processName = Path.GetFileNameWithoutExtension(filename); if (string.IsNullOrWhiteSpace(processName)) continue; _blockedProcessNames.Add(processName); // 选中后立刻终止已经在运行的对应程序,不用等定时器扫描 try { var runningProcs = Process.GetProcessesByName(processName); foreach (var proc in runningProcs) { try { proc.Kill(); proc.WaitForExit(1000); } catch { } finally { proc.Dispose(); } } } catch { } } MessageBox.Show($"已设置屏蔽{_blockedProcessNames.Count}个程序,当前程序运行期间这些程序将无法启动"); } }
注意事项
- 权限要求:如果要屏蔽系统进程、安全软件类高权限程序,需要右键WPF程序选择「以管理员身份运行」,否则会因为权限不足无法终止进程。
- 同名匹配规则:当前逻辑按进程名匹配,如果选中的exe和其他合法程序同名,会被一并终止,比如选中第三方打包的notepad.exe,系统自带记事本也会被屏蔽。
- 性能影响:1秒的扫描间隔几乎不会占用系统资源,用户打开被屏蔽程序时只会看到窗口闪一下就被关闭,感知不到延迟。不建议把间隔设到500毫秒以下,无意义浪费资源。
- 作用范围:监控逻辑绑定当前WPF程序生命周期,程序关闭后定时器自动销毁,屏蔽效果自动失效。
- 数据风险:
Kill()方法是强制终止进程,被终止的程序未保存的内容会全部丢失,测试前注意保存工作内容。 - 扩展功能:如果需要取消屏蔽,加个按钮调用
_blockedProcessNames.Clear()即可。
内容的提问来源于stack exchange,提问作者00 0
相关产品推荐
相关产品推荐

