如何实现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
相关产品推荐
相关产品推荐

