LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

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

一、在C#中判斷指定路徑的程序是否已經(jīng)運(yùn)行(不區(qū)分32/64位)

可以通過以下步驟實(shí)現(xiàn):

  1. 獲取系統(tǒng)中所有進(jìn)程

  2. 獲取每個(gè)進(jìn)程的主模塊路徑

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

以下是完整代碼示例:

using System;

using System.Diagnostics;

using System.IO;

using System.Linq;

using System.Runtime.InteropServices;


public class ProcessChecker

{

    public static bool IsProcessRunning(string targetPath)

    {

        // 規(guī)范化為絕對(duì)路徑

        string fullTargetPath = Path.GetFullPath(targetPath).TrimEnd('\\');


        foreach (var process in Process.GetProcesses())

        {

            try

            {

                // 跳過無主模塊的進(jìn)程

                if (process.MainModule == null) continue;


                string processPath = Path.GetFullPath(process.MainModule.FileName).TrimEnd('\\');

                

                // 路徑比較(不區(qū)分大小寫)

                if (string.Equals(processPath, fullTargetPath, StringComparison.OrdinalIgnoreCase))

                {

                    return true;

                }

            }

            catch (Exception ex) when (ex is Win32Exception || ex is InvalidOperationException || ex is NotSupportedException)

            {

                // 跳過權(quán)限不足或無法訪問的進(jìn)程

                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 

            ? $"程序已在運(yùn)行: {exePath}" 

            : $"程序未運(yùn)行: {exePath}");

    }

}

關(guān)鍵點(diǎn)說明:

1、路徑規(guī)范化處理:

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

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

2、異常處理:

  • 跳過系統(tǒng)/權(quán)限不足的進(jìn)程(Win32Exception)

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

  • 跳過非托管進(jìn)程(NotSupportedException)

3、比較優(yōu)化:

  • 使用StringComparison.OrdinalIgnoreCase進(jìn)行大小寫不敏感比較

  • 直接比較完整路徑而非進(jìn)程名稱

4、資源釋放:

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

注意事項(xiàng):

  • 需要管理員權(quán)限才能訪問所有進(jìn)程信息

  • 對(duì)于UWP/Store應(yīng)用可能不適用

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

  • 支持32/64位混合環(huán)境

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

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


二、如果此程序已經(jīng)打開,則強(qiáng)制將此程序終止退出

代碼如下:

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)

            {

                // 跳過無權(quán)限訪問的進(jìn)程

            }

            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($"已終止進(jìn)程: {process.ProcessName} (PID: {process.Id})");

                }

            }

            catch (Win32Exception ex)

            {

                Console.WriteLine($"權(quán)限不足,無法終止進(jìn)程 {process.ProcessName}: {ex.Message}");

            }

            catch (InvalidOperationException)

            {

                // 進(jìn)程已退出,忽略

            }

            catch (Exception ex)

            {

                Console.WriteLine($"終止進(jìn)程 {process.ProcessName} 時(shí)出錯(cuò): {ex.Message}");

            }

            finally

            {

                process.Dispose();

            }

        }


        if (!found)

        {

            Console.WriteLine($"未找到運(yùn)行中的進(jìn)程: {Path.GetFileName(targetPath)}");

        }

    }


    // 使用示例

    public static void Main()

    {

        string exePath = @"C:\Program Files\MyApp\MyProgram.exe";

        

        if (IsProcessRunning(exePath))

        {

            Console.WriteLine("程序正在運(yùn)行,即將強(qiáng)制終止...");

            KillProcessByPath(exePath);

            

            // 二次驗(yàn)證

            if (!IsProcessRunning(exePath))

            {

                Console.WriteLine("程序已成功終止");

            }

            else

            {

                Console.WriteLine("程序終止失敗");

            }

        }

        else

        {

            Console.WriteLine("程序未運(yùn)行");

        }

    }

}

關(guān)鍵功能說明:

1、進(jìn)程終止方法 KillProcessByPath()

  • 遍歷所有進(jìn)程,匹配目標(biāo)路徑的程序

  • 使用process.Kill()強(qiáng)制終止進(jìn)程

  • 調(diào)用WaitForExit(3000)等待進(jìn)程退出(最多3秒)

2、增強(qiáng)的錯(cuò)誤處理

  • Win32Exception:處理權(quán)限不足問題

  • InvalidOperationException:處理進(jìn)程已退出的情況

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

3、操作反饋

  • 顯示終止進(jìn)程的名稱和PID

  • 提供未找到進(jìn)程的提示

  • 包含權(quán)限錯(cuò)誤的詳細(xì)說明

4、使用示例

  • 先檢查進(jìn)程是否運(yùn)行

  • 終止后二次驗(yàn)證確保操作成功

  • 提供清晰的狀態(tài)反饋

使用注意事項(xiàng):

1、管理員權(quán)限

// 在app.manifest中添加以下內(nèi)容

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

沒有管理員權(quán)限可能無法終止系統(tǒng)進(jìn)程或其他用戶進(jìn)程

2、路徑規(guī)范

  • 支持長(zhǎng)路徑和短路徑

  • 自動(dòng)處理路徑大小寫差異

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

3、特殊場(chǎng)景處理

  • 會(huì)終止所有匹配路徑的進(jìn)程實(shí)例

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

  • 等待進(jìn)程完全退出后再繼續(xù)執(zhí)行

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

// 使用進(jìn)程名終止(需確保進(jìn)程名唯一)

Process.GetProcessesByName("MyProgram")

    .ToList()

    .ForEach(p => p.Kill());

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


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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
香蕉国产免费天天视频频 | 亚洲性夜夜综合久久麻豆 | 色婷婷六月亚洲婷婷6月 | 亚洲va久久久久综合 | 日本乱码伦视频中文字 | 亚洲精品国产福利一二区 |