91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

【C#.net】Winform判斷指定路徑的程序是否已經打開,不區分32位或64位

admin
2025年6月2日 16:53 本文熱度 393

一、在C#中判斷指定路徑的程序是否已經運行(不區分32/64位)

可以通過以下步驟實現:

  1. 獲取系統中所有進程

  2. 獲取每個進程的主模塊路徑

  3. 與目標路徑比較(忽略大小寫和路徑格式差異)

以下是完整代碼示例:

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;


public class ProcessChecker
{
    public static bool IsProcessRunning(string targetPath)
    {
        // 規范化為絕對路徑
        string fullTargetPath = Path.GetFullPath(targetPath).TrimEnd('\\');


        foreach (var process in Process.GetProcesses())
        {
            try
            {
                // 跳過無主模塊的進程
                if (process.MainModule == null) continue;


                string processPath = Path.GetFullPath(process.MainModule.FileName).TrimEnd('\\');
                
                // 路徑比較(不區分大小寫)
                if (string.Equals(processPath, fullTargetPath, StringComparison.OrdinalIgnoreCase))
                {
                    return true;
                }
            }
            catch (Exception ex) when (ex is Win32Exception || ex is InvalidOperationException || ex is NotSupportedException)
            {
                // 跳過權限不足或無法訪問的進程
                continue;
            }
            finally
            {
                process.Dispose();
            }
        }
        return false;
    }


    // 使用示例
    public static void Main()
    {
        string exePath = @"C:\Program Files\MyApp\MyProgram.exe";
        bool isRunning = IsProcessRunning(exePath);
        
        Console.WriteLine(isRunning 
            ? $"程序已在運行: {exePath}" 
            : $"程序未運行: {exePath}");
    }
}

關鍵點說明:

1、路徑規范化處理:

  • 使用Path.GetFullPath()統一路徑格式

  • TrimEnd('\\')消除尾部反斜杠差異

2、異常處理:

  • 跳過系統/權限不足的進程(Win32Exception)

  • 忽略已退出的進程(InvalidOperationException)

  • 跳過非托管進程(NotSupportedException)

3、比較優化:

  • 使用StringComparison.OrdinalIgnoreCase進行大小寫不敏感比較

  • 直接比較完整路徑而非進程名稱

4、資源釋放:

  • 在finally塊中調用process.Dispose()釋放資源

注意事項:

  • 需要管理員權限才能訪問所有進程信息

  • 對于UWP/Store應用可能不適用

  • 路徑比較時考慮到了不同格式(如長短路徑、大小寫)

  • 支持32/64位混合環境

如果遇到權限問題,可在應用程序清單文件(app.manifest)中添加:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />


二、如果此程序已經打開,則強制將此程序終止退出

代碼如下:

using System;
using System.Diagnostics;
using System.IO;
using System.ComponentModel; // 用于Win32Exception


public class ProcessManager
{
    public static bool IsProcessRunning(string targetPath)
    {
        string fullTargetPath = Path.GetFullPath(targetPath).TrimEnd('\\');


        foreach (var process in Process.GetProcesses())
        {
            try
            {
                if (process.MainModule == null) continue;
                
                string processPath = Path.GetFullPath(process.MainModule.FileName).TrimEnd('\\');
                
                if (string.Equals(processPath, fullTargetPath, StringComparison.OrdinalIgnoreCase))
                {
                    return true;
                }
            }
            catch (Exception ex) when (ex is Win32Exception || ex is InvalidOperationException)
            {
                // 跳過無權限訪問的進程
            }
            finally
            {
                process.Dispose();
            }
        }
        return false;
    }


    public static void KillProcessByPath(string targetPath)
    {
        string fullTargetPath = Path.GetFullPath(targetPath).TrimEnd('\\');
        bool found = false;


        foreach (var process in Process.GetProcesses())
        {
            try
            {
                if (process.MainModule == null) continue;
                
                string processPath = Path.GetFullPath(process.MainModule.FileName).TrimEnd('\\');
                
                if (string.Equals(processPath, fullTargetPath, StringComparison.OrdinalIgnoreCase))
                {
                    process.Kill();
                    process.WaitForExit(3000); // 等待最多3秒
                    found = true;
                    Console.WriteLine($"已終止進程: {process.ProcessName} (PID: {process.Id})");
                }
            }
            catch (Win32Exception ex)
            {
                Console.WriteLine($"權限不足,無法終止進程 {process.ProcessName}: {ex.Message}");
            }
            catch (InvalidOperationException)
            {
                // 進程已退出,忽略
            }
            catch (Exception ex)
            {
                Console.WriteLine($"終止進程 {process.ProcessName} 時出錯: {ex.Message}");
            }
            finally
            {
                process.Dispose();
            }
        }


        if (!found)
        {
            Console.WriteLine($"未找到運行中的進程: {Path.GetFileName(targetPath)}");
        }
    }


    // 使用示例
    public static void Main()
    {
        string exePath = @"C:\Program Files\MyApp\MyProgram.exe";
        
        if (IsProcessRunning(exePath))
        {
            Console.WriteLine("程序正在運行,即將強制終止...");
            KillProcessByPath(exePath);
            
            // 二次驗證
            if (!IsProcessRunning(exePath))
            {
                Console.WriteLine("程序已成功終止");
            }
            else
            {
                Console.WriteLine("程序終止失敗");
            }
        }
        else
        {
            Console.WriteLine("程序未運行");
        }
    }
}

關鍵功能說明:

1、進程終止方法 KillProcessByPath()

  • 遍歷所有進程,匹配目標路徑的程序

  • 使用process.Kill()強制終止進程

  • 調用WaitForExit(3000)等待進程退出(最多3秒)

2、增強的錯誤處理

  • Win32Exception:處理權限不足問題

  • InvalidOperationException:處理進程已退出的情況

  • 通用異常捕獲:確保程序不會意外崩潰

3、操作反饋

  • 顯示終止進程的名稱和PID

  • 提供未找到進程的提示

  • 包含權限錯誤的詳細說明

4、使用示例

  • 先檢查進程是否運行

  • 終止后二次驗證確保操作成功

  • 提供清晰的狀態反饋

使用注意事項:

1、管理員權限

// 在app.manifest中添加以下內容
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

沒有管理員權限可能無法終止系統進程或其他用戶進程

2、路徑規范

  • 支持長路徑和短路徑

  • 自動處理路徑大小寫差異

  • 兼容不同格式的路徑分隔符

3、特殊場景處理

  • 會終止所有匹配路徑的進程實例

  • 處理進程樹(如需保留子進程需額外處理)

  • 等待進程完全退出后再繼續執行

?4、替代方案建議(如果權限問題無法解決):

// 使用進程名終止(需確保進程名唯一)
Process.GetProcessesByName("MyProgram")
    .ToList()
    .ForEach(p => p.Kill());

此代碼適用于需要強制終止指定應用程序的場景,如安裝/更新程序前的清理操作,或解決程序卡死問題。


該文章在 2025/6/2 16:55:50 編輯過
關鍵字查詢
相關文章
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 最新国产主播一区二区 | 国产资源在线视 | 老司机免费 | 福利导航h污下载 | 99ri| 成人精品一区二区三 | 区三区重色口味 | 国产激情自拍 | 日韩不卡在线视频 | 日韩老熟女一区二区 | 国产精品拍天天在线 | 日韩私人综合影院 | 日产影视剧影视大全 | 国产思思精品视频 | 九色熟女 | 国产视频在线 | 日韩高清第一页 | 日韩欧美一 | 欧美日韩国产日韩 | 精品欧美一区二 | 国产婬乱视频免费 | 国产激情片 | 国产在线视频专区 | 日韩午夜在线视频 | 97韩剧网首页 | 国产精品官网 | 国产不卡在线观看 | 日韩欧美国产另 | 国产手机在线小视频 | 91福利在线视频 | 精品玖玖玖视 | 成人午夜在线观看 | 国产后式动态A级片 | 国产九九在线视频 | 日本阿v片在线 | 岛国一区二区 | 日韩在线不卡 | 91杏国产在线 | 国产中文字幕在线 | 最新国产精品拍自在线播放 | 日韩亚洲欧美一 |