好吧,所以我創建了我的c#應用程序,爲它創建了一個安裝程序並讓它在我的機器上安裝。限制應用程序的多個實例
問題是,當用戶打開應用程序exe兩次時,會有兩個應用程序運行的實例。我只想讓應用程序的一個實例隨時運行,我該如何去做這件事?
感謝您的幫助,
好吧,所以我創建了我的c#應用程序,爲它創建了一個安裝程序並讓它在我的機器上安裝。限制應用程序的多個實例
問題是,當用戶打開應用程序exe兩次時,會有兩個應用程序運行的實例。我只想讓應用程序的一個實例隨時運行,我該如何去做這件事?
感謝您的幫助,
的常用技術是創建一個名爲Mutex
,並檢查其是否在應用程序啓動的存在。
代碼:
class App : Form
{
Mutex mutex;
App()
{
Text = "Single Instance!";
mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
if (!mutex.WaitOne(0, false))
{
mutex.Close();
mutex = null;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
mutex.ReleaseMutex();
base.Dispose(disposing);
}
static void Main()
{
App app = new App();
if (app.mutex != null) Application.Run(app);
else MessageBox.Show("Instance already running");
}
}
我不知道你是在工作環境中的事,但要牢記關於「單實例應用程序」是如何定義的單實例。如果應用程序可以同時在多個工作站上運行,那麼使用公共數據源就是一個問題?同樣,如果有多個用戶登錄到同一臺計算機上的終端服務情況(或稱「運行情況」),您是否希望限制應用程序,使得每個用戶只有一個實例-電腦?或者你可以簡單地將它作爲每個用戶一個實例嗎?
這些問題的答案可能會導致你在另一個方向上。例如,我們有一個「單實例」應用程序,其範圍是一組計算機。在該組工作站中只允許一個用戶。我們通過在我們的共享數據源中有一個表來跟蹤當前連接的用戶,從而實現了這一目標。這是一個維護問題,因爲您需要確保表格始終保持100%的準確性。處理工作站上意外停電等事件,在該表中留下「假」記錄需要小心處理。
static void Main()
{
using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
if (!mutex.WaitOne(0, false)) {
string processName = GetProcessName();
BringOldInstanceToFront(processName);
}
else {
GC.Collect();
Application.Run(new Voting());
}
}
}
private static void BringOldInstanceToFront(string processName) {
Process[] RunningProcesses = Process.GetProcessesByName(processName);
if (RunningProcesses.Length > 0) {
Process runningProcess = RunningProcesses[0];
if (runningProcess != null) {
IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
}
}
}
代碼顯示似乎被@「全球\」拋出 - 我的歉意。 – lance 2009-07-30 16:14:57
我這個
[STAThread]
static void Main()
{
Process[] result = Process.GetProcessesByName("ApplicationName");
if (result.Length > 1)
{
MessageBox.Show("There is already a instance running.", "Information");
System.Environment.Exit(0);
}
// here normal start
}
它是簡單的解決了這個問題,但我幾乎沒有時間來檢查了更好的解決方案。
如果任何人以不同的名稱獲取應用程序的副本並作爲新進程啓動,則會有多個實例。因此,請使用像描述或原始文件名稱那樣的'processObject.MainModule.FileInfo'字段,即使可執行文件被重命名也不會改變 – Sanjay 2017-06-16 11:23:52
請在回答中顯示代碼。第一個環節已經死了,其他人最終可能會效仿。 – nothingisnecessary 2016-06-30 16:19:36