wince c# 程序只能运行一次

第一种方法 (建议用这个,我已经测试)  代码如下

【1.】

[csharp]  view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Windows.Forms;  
  4. //using RFIDWareHouse.View;  
  5. using System.Runtime.InteropServices;  
  6.   
  7. namespace Phone  
  8. {  
  9.     static class Program  
  10.     {  
  11.         [DllImport("coredll.Dll")]  
  12.         private static extern int GetLastError();  
  13.         [DllImport("coredll.Dll")]  
  14.         private static extern int ReleaseMutex(IntPtr hMutex);  
  15.         [DllImport("coredll.Dll")]  
  16.         private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes, bool bInitialOwner, string lpName);  
  17.   
  18.         private const int ERROR_ALREADY_EXISTS = 0183;  
  19.         [StructLayout(LayoutKind.Sequential)]  
  20.         public class SECURITY_ATTRIBUTES { public int nLength; public int lpSecurityDescriptor; public int bInheritHandle;    }  
  21.   
  22.         /// <summary>  
  23.         /// 应用程序的主入口点。  
  24.         /// </summary>  
  25.         [MTAThread]  
  26.         static void Main()  
  27.         {  
  28.            // Application.Run(new frMain());  
  29.             IntPtr hMutex = CreateMutex(nullfalse"Futureproduct");  
  30.             if (GetLastError() != ERROR_ALREADY_EXISTS)  
  31.             {  
  32.                 System.Windows.Forms.Application.Run(new frMain());  
  33.                 return;  
  34.             }  
  35.             else  
  36.             {  
  37.                 MessageBox.Show("程序已经启动.");  
  38.                 ReleaseMutex(hMutex);  
  39.                 return;  
  40.             }  
  41.         }  
  42.   
  43.     }  
  44. }  

【2】
第二种方法:

[csharp]  view plain copy
  1. public class Mutex  
  2. {  
  3. [DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]  
  4. public static extern IntPtr CreateMutex(  
  5. IntPtr lpMutexAttributes,  
  6. bool InitialOwner,  
  7. string MutexName);  
  8.   
  9. [DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)]  
  10. public static extern bool ReleaseMutex(IntPtr hMutex);  
  11.   
  12. private const int ERROR_ALREADY_EXISTS = 0183;  
  13.   
  14. /// <summary>  
  15. /// 判断程序是否已经运行  
  16. /// </summary>  
  17. /// <returns>  
  18. /// true: 程序已运行,则什么都不做  
  19. /// false: 程序未运行,则启动程序  
  20. /// </returns>  
  21. public static bool IsExist()  
  22. {  
  23. string strAppName =   
  24. System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;  
  25. IntPtr hMutex = CreateMutex(IntPtr.Zero, true, strAppName);  
  26. if (hMutex == IntPtr.Zero)  
  27. throw new ApplicationException("Failure creating mutex: "  
  28. + Marshal.GetLastWin32Error().ToString("X"));  
  29.   
  30. if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS)  
  31. {  
  32. ReleaseMutex(hMutex);  
  33. return true;  
  34. }  
  35. return false;  
  36. }  
  37. }  

 

【3.】

让程序只启动一次 -- Mutex

有时在开发程序的时候, 有时需要只能同时运行一个实例.
Mutex 类, 称为互拆体, 是一个同步基元, 它只向一个线程授予对共享资源的独占访问权。
当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。
如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。

下面演示 Mutex 类来保证应用程序只有唯一实例
[csharp]  view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Windows.Forms;  
  5.   
  6. namespace 让程序只启动一次  
  7. {  
  8.     static class Program  
  9.     {  
  10.         /// <summary>  
  11.         /// 应用程序的主入口点。  
  12.         /// </summary>  
  13.         [STAThread]  
  14.         static void Main()  
  15.         {  
  16.             Application.EnableVisualStyles();  
  17.             Application.SetCompatibleTextRenderingDefault(false);  
  18.   
  19.             bool bCreate;  
  20.             System.Threading.Mutex mutex = new System.Threading.Mutex(false"SINGILE_INSTANCE_MUTEX"out bCreate);  
  21.   
  22.             if (bCreate)  
  23.             {  
  24.                 Application.Run(new Form1());  
  25.             }  
  26.             else  
  27.             {  
  28.                 MessageBox.Show("程序已经启动");  
  29.                 Application.Exit();  
  30.             }  
  31.         }  
  32.     }  
  33. }  

我之前 也很苦恼 有的程序可以 只能开启程序一次 

但是 有的程序为什么不行啊 代码都一样,你有没有发现 这是什么问题??


 如果 上面的方法 都不起作用 尝试下面的这个方法

【4。】

[csharp]  view plain copy
  1. using System;  
  2. using System.Linq;  
  3. using System.Collections.Generic;  
  4. using System.Windows.Forms;  
  5. using System.Runtime.InteropServices;  
  6.   
  7. namespace PDAapplication  
  8. {  
  9.     static class Program  
  10.     {  
  11.         /// <summary>  
  12.         /// 应用程序的主入口点。  
  13.         /// </summary>  
  14.         [MTAThread]  
  15.         static void Main()  
  16.         {  
  17.             //Application.Run(new forApplicatinesMan());  
  18.   
  19.             IntPtr hDlg=IntPtr.Zero;  
  20.             hDlg = FindWindow(null"ThisWindows");//ThisWindows:应用程序主窗体  
  21.           if (hDlg != IntPtr.Zero)  
  22.           {  
  23.               SetForegroundWindow(hDlg);  
  24.           }  
  25.           else  
  26.           {  
  27.               Application.Run(new forApplicatinesMan());  
  28.           }  
  29.         }  
  30.         [DllImport("coredll.Dll")]  
  31.         public static extern IntPtr FindWindow(String classname, String title);  
  32.         [DllImport("coredll.Dll")]  
  33.         public static extern void SetForegroundWindow(IntPtr hwnd);  
  34.   
  35.     }  
  36. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值