最近發現很多人在論壇中問到如何防止程序被多次運行的問題的,如: http://social.msdn.microsoft.com/Forums/zh-CN/6398fb10-ecc2-4c03-ab25-d03544f5fcc9, 所以這裡就記錄下來,希望給遇到同樣問題的朋友有所參考的,同時也是對自己的一個積累。在介紹具體實現代碼之前,我們必須明確解決這個問題的思路是什麼的?下面只要分享我的一個思考的這個問題的方式:
從上面的分析過程中可以看出,我們解決這個問題的思路就是從進程入手,第三點的思路就是直接從進程數量入手,而第四點思路也是從進程入手,只是做了一個變換罷了,讓一個變量來唯一標識一個進程,當變量存在時說明該程序進程也運行了。
弄懂了主要的實現思路之後,下面看代碼實現就完全不是問題了,使用互斥量的實現就是第四點的思路的體現,我們用為該程序進程創建一個互斥量Mutex對象變量,當運行該程序時,該程序進程就具有了這個互斥的Mutex變量,如果再次運行該程序時,通過檢查該互斥變量是否存在(來替換檢測這個進程是否存在),如果存在則說明程序已運行,否則就沒運行。。下面就具體看看實現代碼吧:
方法一:使用互斥量 (Mutex mutex = Mutex(, Application.ProductName, System.Environment.Exit(
有了上面的思路分析之後,相信大家看下面代碼會覺得一目了然,這裡就不多解釋了,直接看代碼:
方法二:使用進程名= (processcollection.Length >= Application.Run(
方法三:使用的Win32函數的聲明 [DllImport( ShowWindow(IntPtr hWnd, [DllImport( WS_SHOWNORMAL = 方法三:調用Win32 API,並激活運行程序的窗口顯示在最前端 Process process = (process == MessageBox.Show( 方法三定義的方法 Process currentProcess = Process[] processcollection = Process.GetProcessesByName(currentProcess.ProcessName.Replace(, (Process process (process.Id != (Assembly.GetExecutingAssembly().Location.Replace(, ) ==
方法四:使用的Win32函數的聲明 [DllImport( IntPtr FindWindow( lpClassName, [DllImport(, SetLastError = SwitchToThisWindow(IntPtr hWnd, [DllImport(, EntryPoint = , CharSet = ShowWindow(IntPtr hwnd, SW_RESTORE = 方法四: 可以是托盤中的隱藏程序顯示出來 Process currentproc == Process.GetProcessesByName(currentproc.ProcessName.Replace(, (processcollection.Length >= (Process process (process.Id != (process.MainWindowHandle.ToInt32() == formhwnd = FindWindow(, SwitchToThisWindow(process.MainWindowHandle,
四種實現方式的運行效果都是差不多的,這裡就以實現方式一作為演示的,具體實現效果如下圖:
寫這個專題主要是看到原因是看到論壇中有些朋友問了這樣的問題,並且本人也回答了,所以就總結下具體的實現代碼來幫助遇到同樣問題的朋友做一個參考,同時也是對自己一個學習的積累和復習。下面附上程序所有源碼:
本專題程序源碼:http://files.cnblogs.com/zhili/OnlyInstanceRunning.zip