You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF中如何终止OpenFileDialog选中文件对应运行进程

WPF 屏蔽选中程序运行实现方案

核心实现逻辑

要实现选中程序在代码运行期间无法启动,不需要复杂系统钩子,靠两步即可实现:

  1. 从选中的exe文件路径提取对应进程名(即exe文件名去掉.exe后缀的部分)
  2. 用轻量定时器高频扫描系统运行进程,发现匹配的进程直接强制终止,用户打开程序的瞬间就会被关闭,达到无法使用的效果。

前置准备

首先在代码文件顶部引入需要的命名空间:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:39:28