国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C#判斷程序是否運行的方法
C#判斷程序是否運行的方法
2009-12-08 09:28

命名空間是using System.Diagnostics;

string name = "aaa";//程序進(jìn)程名稱
   int ProgressCount = 0123456;//判斷進(jìn)程是否運行的標(biāo)識
   Process[] prc = Process.GetProcesses();
   foreach(Process pr in prc) //遍歷整個進(jìn)程
   {
            if (name == pr.ProcessName) //如果進(jìn)程存在
            {    
                    ProgressCount = 0; //計數(shù)器清空
                     return;
            }
   }
   if(ProgressCount!=0)//如果計數(shù)器不為0,說名所指定程序沒有運行
   {
    try
    {
     //調(diào)用外部程序
     Process MyProcess = new Process();
     MyProcess.StartInfo.FileName = "d:/aaa.exe";
     MyProcess.StartInfo.Verb = "Open";
     MyProcess.StartInfo.CreateNoWindow = true;
     MyProcess.Start();
    }
    catch(Exception d)
    {
     MessageBox.Show(d.Message+"","提示!!!!");
    }
   }
   else
   {
    MessageBox.Show("對不起,本地已經(jīng)有系統(tǒng)正在運行!\n.","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
   }

 

From: http://blog.csdn.net/hank212/archive/2007/09/07/1776261.aspx

 

另:

利用Mutex實現(xiàn)只運行一個程序?qū)嵗?br>static void Main()
        {
            bool canCreateNew;
           
            //限制單例運行
            Mutex m = new Mutex(true, "AnyName", out canCreateNew);
            if (canCreateNew)
            {
                string filePath = AppDomain.CurrentDomain.BaseDirectory +
                System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".xml";
                if (System.IO.File.Exists(filePath))
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Command.config = new Configurations(filePath);
                    Application.Run(new FormMain());
                }
                else
                {
                    FileHelper.WriteLog(FileHelper.LogType.LTError, "XML not exist");
                }
                m.ReleaseMutex();    //必須
            }
            else
            {
                MessageBox.Show("");
            }
        }

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/gaoyunpeng/archive/2008/05/16/2452052.aspx

 

很多的軟件都支持一次只能運行一個程序,比如迅雷。一直搞不清楚這個是怎么做的。最近正好做了一個小工具,需要一個用戶在一個網(wǎng)域內(nèi)只能開啟一個這個小工具。這個工具就要支持,在同一個網(wǎng)域內(nèi),同一個用戶只能開啟一個這個工具。
我的做法是:抓取所有正在運行的這個工具的進(jìn)程,然后和當(dāng)前網(wǎng)域當(dāng)前用戶的進(jìn)程比較,如果存在就返回已經(jīng)運行的當(dāng)前網(wǎng)域當(dāng)前用戶的進(jìn)程,不存在就開啟。

剛開是我用到了Process.StartInfo.UserName和Process.StartInfo.Domain來抓取進(jìn)程的用戶名和網(wǎng)域,發(fā)現(xiàn)抓出來的全是空字串。沒辦法只有另尋他路。這里用到了WMI , 關(guān)于WMI是什么請參閱MSDN.

還是以實際例子來說明吧。首先建一個WINForm的工程,名字就叫做WINFormTest吧。呵呵呵,命名不規(guī)范了。

具體代碼如下:

static class Program
    {
       
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool BringWindowToTop(IntPtr hwnd);
        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        private const int WS_SHOWNORMAL = 1; //0不可見但仍然運行,1居中,2最小化,3最大化
  
     
        /// <summary>
        /// 應(yīng)用程式的主要進(jìn)入點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            string szRepeatRun = "";

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

           Process instance = RunningInstance();//判斷是否已經(jīng)有運行的程序,如果有就返回該進(jìn)程,沒有返回Null

            if (instance == null)
            {
                Application.Run(new frmWINFormTest());
            }
            else
            {                 

               if (instance.MainWindowHandle.ToString() =="0")
                        MessageBox.Show("該程序已經(jīng)運行!");               

                // 將窗口提到桌面的最上層,這里如果窗口自小化了,就不能提到最上層,原因正在解決。
                SetForegroundWindow(instance.MainWindowHandle);
              }
           
            //Application.Run(new EIPNotify());
        }
        public static Process RunningInstance()
        {
            int i, j;
            string szUserName, szProcessName, szDomain;//當(dāng)前進(jìn)程的用戶名,進(jìn)程名,和網(wǎng)域
            ArrayList ALProcess = new ArrayList();// 存儲所有開啟的程序的進(jìn)程ID,用戶名,網(wǎng)域
            tagProcess tProcess = new tagProcess();
            j = 0;
            szUserName = szDomain = "";
           
            szProcessName = "";
            Process current = Process.GetCurrentProcess();//得到當(dāng)前進(jìn)程
            Process[] processes = Process.GetProcessesByName(current.ProcessName);//得到和當(dāng)前進(jìn)程同名的進(jìn)程
            // WMI 得到任務(wù)管理器中的所有的進(jìn)程。    
            ManagementObjectSearcher psch=new ManagementObjectSearcher("select * from Win32_Process");
           
            foreach(ManagementObject mob in psch.Get())  
            {
                i = mob["Name"].ToString().LastIndexOf('.');
                if (i>=0)
                    szProcessName = mob["Name"].ToString().Substring(0, i);

                // 和當(dāng)前進(jìn)程同名,并且不是當(dāng)前進(jìn)程存入到Arraylist中

               if (szProcessName == current.ProcessName && mob["processID"].ToString() != current.Id.ToString())
                {
                    string[] pob = new string[2];
                    mob.InvokeMethod("GetOwner", (object[])pob);// 得到進(jìn)程的相關(guān)信息,存儲在Object 數(shù)組中,其中第一個為用戶名,第二個為網(wǎng)域,其它的是什么有待繼續(xù)研究。
                    object UserName = pob[0];//進(jìn)程的用戶名
                    tProcess.szOldUserName = UserName.ToString();
                    object Domain = pob[1];//進(jìn)程的網(wǎng)域
                    tProcess.szOldDomain = Domain.ToString();
                    tProcess.szProcessID = mob["processID"].ToString();// 進(jìn)程的ID
                    ALProcess.Add(tProcess);
                }

                if (szProcessName == current.ProcessName && mob["processID"].ToString() == current.Id.ToString())// 獲取當(dāng)前進(jìn)程的用戶名和網(wǎng)域
                {
                    string[] pob = new string[2];
                    mob.InvokeMethod("GetOwner", (object[])pob);
                    object UserName = pob[0];
                    szUserName = UserName.ToString();
                    object Domain = pob[1];
                    szDomain = Domain.ToString();
                }               
            }
            for (j = 0; j < ALProcess.Count; j++)
            {
                tProcess = (tagProcess)ALProcess[j];
                if (tProcess.szOldUserName == szUserName && tProcess.szOldDomain == szDomain)
                {
                    foreach (Process process in processes)
                    {
                        if ((process.ProcessName == current.ProcessName) && (process.Id != current.Id) && (process.Id.ToString() == tProcess.szProcessID))
                        {
                            return process;
                        }
                    }
                }
            }
            return null;
           
        }
        public struct tagProcess
        {
            public string szProcessID;
            public string szOldUserName;
            public string szOldDomain;
        }

}

另外一種防止重復(fù)運行的方法

bool mutex IsNew;
using (System.Threading.Mutex m= new System.Threading.Mutex(true,appName,out IsNew))
{
      if(IsNew)
            //第一次運行,啟動程序
       else
            //程序已經(jīng)在運行,退出

}


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)于 Android 應(yīng)用多進(jìn)程的整理
進(jìn)程名稱相同,根據(jù)標(biāo)題不同而殺掉進(jìn)程
獲取進(jìn)程列表、名稱、路徑
如何殺死Word,Excel等進(jìn)程?
Android核心分析(21)----Android應(yīng)用框架之AndroidApplication
Android應(yīng)用程序在新的進(jìn)程中啟動新的Activity的方法和過程分析
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服