C# 檢查是否已經運行(兩種方法)

jopen 9年前發布 | 1K 次閱讀 C#

有些時候我們需要讓軟件單獨運行 而不是重復無理由運行,

我們舉個例子:如音樂播放軟件你能夠選擇重復運行嗎?

你在注冊表(Reg)中關聯了右鍵快捷打開方式,但是如果軟

件只是單純意味上的重復運行實例 想必用戶看到這樣的軟

件表情一定會很夸張 很讓人感到好笑。不過談正經的 如何

避免軟件多次運行 我給出兩種辦法,一種為互斥體(Mutex)
另一種為API Event兩種辦法都是比較好的,可以這樣理解

上面兩種辦法會在系統中注冊一個字符串標志 每次軟件啟動

時去檢查標志是否存在,然而軟件銷毀意味著 系統會自動替你

釋放掉該標志 所以我們是不需要去Close及CloseHandle而且

我并不建議大家沒事去關閉系統的內核對象 誰知道你會不會因

為操作造成程序或系統不穩定呢 誰也不能保證對吧 不過則論

易用性我倒是感到很不錯 挺人性化的 且不是花哨的技術 很難的。

using System.Threading;

    bool bCreatedNew;  
    Mutex mutex = new Mutex(false, "MyApp", out bCreatedNew);  

上面我們只需要判斷bCreatedNew是否為false則可以。如果沒有

創建成功或輸入false否則為true 我們既然要判斷系統中是否運行

了相同的軟件 而系統不允許我們注冊相同的標志 那么肯定會false

了,道理很容易說的通竅,對吧。下面我們講講API Event的辦法

using System.Runtime.InteropServices;

    const int NULL = 0;  
    const int EVENT_ALL_ACCESS = 2031619;  
    if (OpenEvent(EVENT_ALL_ACCESS, false, "MyApp"))  
    {  
        // 正在運行  
    }  
    else  
    {  
        // 沒有運行  
        CreateEvent(NULL, false, false, "MyApp");  
    }  

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool OpenEvent(int dwDesiredAccess, bool bInheritHandle, string lpName);

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool CreateEvent(int lpEventAttribute, bool bManualReset, bool bInheritHandle, string lpName);</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!