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

如何实现AnyDesk与TeamViewer运行时阻止自身应用启动?

问题分析与修正方案

原代码存在的问题

  • API用法错误:Process.GetProcesses()的参数是机器名称,不是进程名。要检测指定进程是否运行,应该用Process.GetProcessesByName(),而且参数需要传不带.exe后缀的进程名(比如"Anydesk"而非"Anydesk.exe")。
  • 检测不完整:原代码只检查了AnyDesk,完全没处理TeamViewer的检测,不符合你“两个程序均关闭才可启动”的需求。
  • 冗余逻辑:就算检测到目标进程,循环里每次调用Application.Exit()是多余的——只要发现有一个目标进程在运行,直接退出程序即可,无需遍历所有进程实例。

修正后的实现代码

WPF 应用示例(放在启动事件中)

// 封装进程检测方法,复用性更高
private bool IsProcessRunning(string processName)
{
    // GetProcessesByName 返回指定进程名的所有运行实例,长度大于0即表示进程在运行
    return Process.GetProcessesByName(processName).Length > 0;
}

// 在应用启动入口添加检测逻辑
private void Application_Startup(object sender, StartupEventArgs e)
{
    // 检测两个目标进程的运行状态
    bool anyDeskActive = IsProcessRunning("Anydesk");
    bool teamViewerActive = IsProcessRunning("TeamViewer");

    if (anyDeskActive || teamViewerActive)
    {
        // 可选:给用户提示失败原因
        MessageBox.Show("请关闭AnyDesk和TeamViewer后再启动应用!");
        // 终止应用启动
        Application.Current.Shutdown();
        return;
    }

    // 检测通过,正常启动主窗口
    MainWindow mainWindow = new MainWindow();
    mainWindow.Show();
}

WinForms 应用示例(放在Program.cs的Main方法中)

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    // 直接检测进程状态
    bool anyDeskRunning = Process.GetProcessesByName("Anydesk").Length > 0;
    bool teamViewerRunning = Process.GetProcessesByName("TeamViewer").Length > 0;

    if (anyDeskRunning || teamViewerRunning)
    {
        MessageBox.Show("请关闭AnyDesk和TeamViewer后再启动应用!");
        return;
    }

    // 检测通过,启动主窗体
    Application.Run(new Form1());
}

额外提示

  • 确认进程名:TeamViewer的主进程名通常是TeamViewer,如果检测不到,可以打开任务管理器查看具体进程名称(注意区分服务进程TeamViewer_Service和主程序进程)。
  • 体验优化:一定要加上提示框,否则用户会不知道程序为什么启动失败,提升易用性。

内容的提问来源于stack exchange,提问作者always

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:30:38