当前位置:  编程技术>.net/c#/asp.net

c#防止多次运行代码收集分享

    来源: 互联网  发布时间:2014-10-23

    本文导语:  1. 代码如下:class Program    {        [STAThread]        static void Main(string[] args)        {            //防止程序多次运行            if (!OneInstance.IsFirst("MyTest"))            {                Console.Wri...

1.

代码如下:

class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            //防止程序多次运行
            if (!OneInstance.IsFirst("MyTest"))
            {
                Console.WriteLine("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!");
                return;
            }
            Console.WriteLine("正在运行中");
            Console.ReadLine();
        }
    }
    public static class OneInstance
    {
        ///
        ///判断程序是否正在运行
        ///
        ///程序名称
        ///如果程序是第一次运行返回True,否则返回False
        public static bool IsFirst(string appId)
        {
            bool ret = false;
            if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
            {
                CreateMutex(IntPtr.Zero, 0, appId);
                ret = true;
            }
            return ret;
        }
        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr OpenMutex(
            uint dwDesiredAccess, // access
            int bInheritHandle,    // inheritance option
            string lpName          // object name
            );
        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr CreateMutex(
            IntPtr lpMutexAttributes, // SD
            int bInitialOwner,                       // initial owner
            string lpName                            // object name
            );
    }

2.

代码如下:

string MnName = Process.GetCurrentProcess().MainModule.ModuleName;
 //返回不具有扩展名的制定路径字符串的文件名
String Pname = Path.GetFileNameWithoutExtension(MnName);
Process[] myprocess = Process.GetProcessesByName(Pname);
if (myprocess.Length > 1)
{
    MessageBox.Show("yici", "tishi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
    //Application.EnableVisualStyles();
    ////Application.SetCompatibleTextRenderingDefault(false);
    //Application.Run(new Form1());
}

3.原文如下(http://www./article/41179.htm)

经常我们会有这样的需求,只让应用程序运行一个实体。通常我们的情况是,双击一个exe文件,就运行一个程序的实体,再双击一次这个exe文件,又 运行这个应用程序的另一个实体。就拿QQ游戏来说吧,一台电脑上一般只能运行一个QQ游戏大厅(不过以前听说过有双开的外挂)。

那我们的程序也能像QQ游戏那里禁止多次启动吗,答案是可以的,下面介绍下一个简单的实现方法,那就是Mutex(互斥)。

      Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多个线程同步访问的一个类。它非常类似了Monitor类,因为他们都只有一个线程能拥有锁定。而操作系统能够识别有名称的互 斥,我们可以给互斥一个唯一的名称,在程序启动之前加一个这样的互斥。这样每次程序启动之前,都会检查这个命名的互斥是否存在。如果存在,应用程序就退 出。

代码如下:

static class Program
    {
        ///
        /// The main entry point for the application.
        ///
        [STAThread]
        static void Main()
        {
            bool createdNew;
            //系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次
            //第二个参数可以设置为产品的名称:Application.ProductName

            //每次启动应用程序,都会验证名称为SingletonWinAppMutex的互斥是否存在
            Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);

            //如果已运行,则在前端显示
            //createdNew == false,说明程序已运行
            if (!createdNew)
            {
                Process instance = GetExistProcess();
                if (instance != null)
                {
                    SetForegroud(instance);
                    Application.Exit();
                    return;
                }
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }

        ///
        /// 查看程序是否已经运行
        ///
        ///
        private static Process GetExistProcess()
        {
            Process currentProcess = Process.GetCurrentProcess();
            foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
            {
                if ((process.Id != currentProcess.Id) &&
                    (Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))
                {
                    return process;
                }
            }
            return null;
        }

        ///
        /// 使程序前端显示
        ///
        ///
        private static void SetForegroud(Process instance)
        {
            IntPtr mainFormHandle = instance.MainWindowHandle;
            if (mainFormHandle != IntPtr.Zero)
            {
                ShowWindowAsync(mainFormHandle, 1);
                SetForegroundWindow(mainFormHandle);
            }
        }

        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    }


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问socket编程中是如何防止别人恶意进行数据包复制?
  • 程序中如何防止文件操作冲突?
  • sqlserver中如何防止数据库被下载
  • Asp.net防止重复提交的实现方法
  • 防止反编译的功能
  • 如何防止没有权限的人由于知道url,直接输入url,来察看文件呢?
  • 如何防止JtextArea里的文字被用户选择并copy???
  • 如何防止用户更新页面刷新计数器!
  • 怎样防止非本域的form提交
  • 请问Apache怎样防止CC攻击?
  • MySQL防止delete命令删除数据的两种方法
  • 请教怎么让计数器防止刷新???
  • 关于qmail里smtp,pop3,vpopmail对防止垃圾邮件relay的问题
  • 如何在一个用户对application操作时防止别的用户对它操作?(好难啊)
  • jquery防止重复执行动画避免页面混乱
  • 如何防止按浏览器右上角的"x" 来关闭浏览器
  • 如何防止IE缓存jsp文件
  • 如何防止Tomcat缓存beans??
  • 请问:如何防止他人进入系统操作(急!)
  • 如果防止JDialog被改变大小


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3