2011-04-11 40 views
4

確定自己的進程名,以避免用戶運行我的應用程序的多個實例,我使用這個代碼: -在C#

Process[] pArry = Process.GetProcesses(); 
      int nCount = 0; 
      foreach (Process p in pArry) 
      { 
       string ProcessName = p.ProcessName; 
       ProcessName = ProcessName.ToLower(); 
       if (ProcessName.CompareTo("myApp") == 0) 
       { 
        nCount++; 
       } 
      } 
      if (nCount > 1) 
      { 
       MessageBox.Show(AppAlreadyRunning,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error); 
       Process.GetCurrentProcess().Kill(); 
      } 

但是我們知道,進程名稱的改變,如果改變的exe名稱。 因此,如果用戶將「myApp.exe」更改爲「UserApp.exe」,則此修補程序將不起作用! 有什麼出路嗎?

我在VS2010中使用C#。 謝謝!

回答

4
+0

謝謝....雖然我先搜索,但我找不到它......這個線程真的很有幫助! – Swanand 2011-04-11 06:18:47

+0

+1使用內核模式構造(如互斥量)絕對是做到這一點的方法(儘管使用信號量的開銷略少)。很容易更改第二個實例的進程名稱,以避免依賴進程名稱的檢查。 – 2011-05-13 16:04:36

7

這是非常簡單的過程。調用此函數將返回一個包含所需信息的進程類。

Process.GetCurrentProcess() 

這裏有一些代碼給你。

 Process[] pArry = Process.GetProcesses(); 
     foreach (Process p in pArry) 
     { 
      if (p.Id == Process.GetCurrentProcess().Id) 
       continue; 
      string ProcessName = p.ProcessName; 
      if(ProcessName == Process.GetCurrentProcess().ProcessName) 
      { 
       MessageBox.Show(AppAlreadyRunning,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error) 
       SetForegroundWindow(p.MainWindowHandle); 
       Application.Exit(); 
      } 
     } 
+1

@Swanand Purankar:雖然這不回答你的問題,你應該看看使用內核模式結構來做到這一點。即使您正在檢查進程名稱,用戶也很容易製作具有不同名稱的exe文件的多個副本。在這種情況下,進程名稱檢查不會阻止用戶同時運行所有exe文件。 – 2011-05-13 16:07:17

+0

@AdamRalph雖然我幾乎在一年半之後回覆,但我記得,我也使用了Mutex ......感謝您的評論! :) – Swanand 2012-10-27 09:04:13

1

我敢打賭,你可以使用Process.GetCurrentProcess()(爲你做殺的過程)來獲得實際的名稱,並利用它來進行比較。