精品熟人妻一区二区三区四区不卡-精品爽黄69天堂a-精品水蜜桃久久久久久久-精品丝袜国产自在线拍-精品丝袜国产自在线拍a-精品丝袜国产自在线拍免费看

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

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

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

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

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

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

  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)

    {

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

        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('\\');

                

                // 路徑比較(不區(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)限不足或無法訪問的進程

                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}");

    }

}

關(guān)鍵點說明:

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

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

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

2、異常處理:

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

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

  • 跳過非托管進程(NotSupportedException)

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

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

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

4、資源釋放:

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

注意事項:

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

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

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

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

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

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


二、如果此程序已經(jī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)限訪問的進程

            }

            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($"權(quán)限不足,無法終止進程 {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("程序未運行");

        }

    }

}

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

1、進程終止方法 KillProcessByPath()

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

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

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

2、增強的錯誤處理

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

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

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

3、操作反饋

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

  • 提供未找到進程的提示

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

4、使用示例

  • 先檢查進程是否運行

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

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

使用注意事項:

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

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

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

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

2、路徑規(guī)范

  • 支持長路徑和短路徑

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

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

3、特殊場景處理

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

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

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

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

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

Process.GetProcessesByName("MyProgram")

    .ToList()

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

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


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

主站蜘蛛池模板: 日本综合aⅴ精品 | 成人在线高清 | 麻豆国产尤物av尤物在线观看 | 日日碰狠狠添天天爽无码 | 午夜性色一区二区三区不卡视频 | 丰满熟女人妻一区二区三 | 亚洲日韩精品欧美一区二区一 | 亚洲无码视频一区二区 | 无码人妻精品一区二区三区99 | 97久久精品 | 国产真实伦在线观看 | 亚洲精品无码专区久久久 | 97碰碰久久人人 | 欧美最猛黑 | 欧美日韩国产 | 丰满人妻大屁股一区二区三区 | 成年福利片在线观看 | 国产在线午夜不卡精品影院 | 无码高潮爽到爆 | 饥渴少妇av无码 | 日本一区午夜艳熟免费 | 精品一区二区三区在线观看 | 中文字幕精品无码亚洲字幕 | 午夜精品久久影院蜜 | 日韩精品国 | 国产福利91 | 国产成人精品午夜在线播放 | 午夜精品久久无码av网站 | 动漫成人无码精品一区二区三区 | 国产精品国产三级国产av中文 | 久草视频网站 | 国产高清不卡二区免费视频 | 国产最变态调教视频 | 国产av一级毛片 | 欧洲人妻丰满av无码久久不 | 国产精品国产三级国产av中文 | 国产欧美一区二区 | 国产人伦视频在线观看 | 国产精品网站 | 97在线观看 | 亚洲成a人片在线观看老师 亚洲成a人片在线观看天堂无码 |