程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [C# 開發技巧]如何防止程序多次運行

[C# 開發技巧]如何防止程序多次運行

編輯:C#入門知識

一、引言

最近發現很多人在論壇中問到如何防止程序被多次運行的問題的,如: http://social.msdn.microsoft.com/Forums/zh-CN/6398fb10-ecc2-4c03-ab25-d03544f5fcc9, 所以這裡就記錄下來,希望給遇到同樣問題的朋友有所參考的,同時也是對自己的一個積累。在介紹具體實現代碼之前,我們必須明確解決這個問題的思路是什麼的?下面只要分享我的一個思考的這個問題的方式:

從上面的分析過程中可以看出,我們解決這個問題的思路就是從進程入手,第三點的思路就是直接從進程數量入手,而第四點思路也是從進程入手,只是做了一個變換罷了,讓一個變量來唯一標識一個進程,當變量存在時說明該程序進程也運行了。

二、使用互斥量Mutex

弄懂了主要的實現思路之後,下面看代碼實現就完全不是問題了,使用互斥量的實現就是第四點的思路的體現,我們用為該程序進程創建一個互斥量Mutex對象變量,當運行該程序時,該程序進程就具有了這個互斥的Mutex變量,如果再次運行該程序時,通過檢查該互斥變量是否存在(來替換檢測這個進程是否存在),如果存在則說明程序已運行,否則就沒運行。。下面就具體看看實現代碼吧:

  
         
  方法一:使用互斥量
            
             (Mutex mutex =  Mutex(, Application.ProductName, 
                
                    System.Environment.Exit(

三、直接判斷進程是否存在的方式來解決這個問題

3.1 判斷該程序進程數量的方式

有了上面的思路分析之後,相信大家看下面代碼會覺得一目了然,這裡就不多解釋了,直接看代碼:

     方法二:使用進程名=
             (processcollection.Length >= 
                Application.Run( 

3.2 直接判斷程序進程是否存在的方式

  方法三:使用的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(, ) ==  
         
         
          

3.3 解決3.2實現方式中存在的問題——只能是最小化的窗體顯示出來,如果隱藏到托盤中則不能把運行的程序顯示出來

  方法四:使用的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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved