2009-07-17 107 views
3

可能重複:
What is the correct way to create a single instance application?
Prevent multiple instances of a given app in .NET?在.net中製作單實例應用程序的最佳方法是什麼?

檢查我的另一個進程是否具有相同名稱的存在? (如果用戶沒有權限這麼做?)

將文件寫入磁盤並在退出之前將其刪除? (什麼異常終止?)

這將是一個最佳做法做到這一點?

+0

可能的重複:http://stackoverflow.com/questions/19147/what-is-the-correct-way-to-create-a-single-instance-application – 2009-07-17 19:58:32

+0

多個副本:http://stackoverflow.com/questions/19147/what-is-the-correct-way-to-create-a-single-instance-application http://stackoverflow.com/questions/93989/prevent-multiple-instances-of-a-given-網絡應用程序http://stackoverflow.com/questions/906100/run-one-instance-from-the-application – Noldorin 2009-07-17 19:58:52

回答

6

您可以使用互斥鎖。

bool firstInstance = true; 
using (Mutex mutex = new Mutex(true, "MyApplicationName", out firstInstance)) 
{ 
    if (firstInstance) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 
    else 
    { 
     // Another instance loaded 
    } 
} 
0

可以使用Process類的GetProcessesByName方法去尋找另一個正在運行的進程具有相同的名稱,並退出,如果你找到一個。

0

我依賴於你正在使用的技術。有相當多的解決方案,一些更適合WPF,有的爲的WinForms:

  • WindowsFormsApplicationsBase用互斥鎖(複雜一點)(我的首選方式)
  • 檢查與同一個過程細節(我不喜歡這個)

更多WindowsFormsApplicationsBase:
http://www.openwinforms.com/single_instance_application.html

更多的是互斥和測試過程:
http://www.ravinderweb.com/page/Single-Instance-of-the-Application-using-C-Trick-and-Mutex.aspx

我不會用一個文件,這是容易出現錯誤和沒有文件訪問,甚至可能會導致程序異常,即使它不是你的應用程序的重要組成部分。

0

有幾種方法可以做到這一點,所有這些方法都有其優點和缺點,谷歌搜索會給你很多關於它的討論。

你描述的方法有你提到的弱點。另外你需要考慮你想要多麼獨特您的實例是:

  • 每WindowStation每臺機器

我有一個可以用來強制一個實例類每個WindowStation for Windows窗體應用程序。基本上,它使用的P/Invoke做啓動時以下,使用互斥對競爭條件保護:

  • 定義一個固定唯一的字符串,以確定您的應用程序(如GUID)

  • 獲得一個互斥體,其名稱來源於您的唯一字符串。

  • 使用P/Invoke調用EnumWindows來枚舉所有主窗口。

  • 在EnumWindows回調中,依次在每個窗口上使用P/Invoke調用GetProp,並將窗口句柄和唯一值作爲參數傳遞。如果GetProp檢測到具有唯一鍵(即應用程序的另一個實例)的窗口,請激活它(PostMessage(... SC_RESTORE ...),SetForegroundWindow,SetFocus),然後退出新實例。

  • 如果枚舉所有窗口而不查找以前的實例,則使用P/Invoke調用SetProp爲應用程序的主窗體句柄設置唯一值。

  • 釋放互斥鎖並繼續啓動。

在我的使用情況下,這種解決方案比單純持有過程中的壽命互斥,因爲如果用戶開始第二個實例,而不是在退出提供了一種方式來激活前一個實例更好。使用GetProp/SetProp爲您提供了一種在不依賴進程名稱的情況下識別流程實例的方法。

相關問題