C#防止程序重复运行

本文介绍了如何使用C#通过WMI技术检查并防止同一网域内的用户启动多个相同进程。通过获取当前进程和所有运行实例的信息,比较用户名和网域,确保仅允许一个实例运行。

很多的软件都支持一次只能运行一个程序,比如迅雷。一直搞不清楚这个是怎么做的。最近正好做了一个小工具,需要一个用户在一个网域内只能开启一个这个小工具。具体的需求是:说的通俗简单就是,有一台服务器,用户用一台显示器和一个键盘连到这个服务器上。这样这个服务器就可能同时用多个用户,而且这些用户可能在不同的网域内。这个工具就要支持,在同一个网域内,同一个用户只能开启一个这个工具。所以,简单的只能开启一个程序在这里就行不通了。

我的做法是:抓取所有正在运行的这个工具的进程,然后和当前网域当前用户的进程比较,如果存在就返回已经运行的当前网域当前用户的进程,不存在就开启。

刚开是我用到了Process.StartInfo.UserName和Process.StartInfo.Domain来抓取进程的用户名和网域,发现抓出来的全是空字串。没办法只有另寻他路。这里用到了WMI , 关于WMI是什么请参阅MSDN.

还是以实际例子来说明吧。首先建一个WINForm的工程,名字就叫做WINFormTest吧。呵呵呵,命名不规范了。

具体代码如下:

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>
        /// 應用程式的主要進入點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            string szRepeatRun = "";

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

           Process instance = RunningInstance();//判断是否已经有运行的程序,如果有就返回该进程,没有返回Null

            if (instance == null)
            {
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值