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

主站蜘蛛池模板: 日韩欧美婷婷 | 国产精品线在线精品 | 人人草人人 | 国产高清在线视频色 | 午夜福利免费体验区 | 日韩美女欧美精品 | 午夜亚洲一区 | 欧美一级aa | 国产日韩在 | 国产亚a | 91福利在线观看 | 国产精品人妖 | 国产精品最新网址 | 91看片婬黄大片 | 欧美做a一级视频 | 午夜影视 | 国产理论在线观 | 国产亚洲综合 | 97久夜色 | 伦理一国产A级 | 国产真实灌醉 | 91露脸对白 | 韩国三级激情 | 日韩国产精品一区 | 91国自产精品 | 成人午夜在线国产 | 国产亚洲天堂 | 91国产最 | 国产女同百合91 | 国产日韩精品一区二 | 国产极品美女视频 | 日本高清在线播放 | 日本最新伦中文字幕 | 日韩欧美国产另 | 成人福利在线观看 | 3d漫画网 | 日韩国产在线 | 国内自拍中文字幕 | 日韩美女视频一区 | 91精品酒店情| 日比网站在线观 |