代码库のC#只允许运行一个窗体实例
- using System;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;//使用DllImport的必须。
- using System.Diagnostics;//引入Process 类
-
- namespace 命名空间
- {
- static class Program
- {
-
- private const int WS_SHOWNORMAL = 1;
- [DllImport("User32.dll")]
- private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
- [DllImport("User32.dll")]
- private static extern bool SetForegroundWindow(IntPtr hWnd);
-
- /// <summary>
- /// 应用程序的主入口点。
- /// </summary>
- [STAThread]
- static void Main()
- {
- Process instance = GetRunningInstance();
- if (instance == null)
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new frm_Main());//在这启动主窗体。
- }
- else
- {
- HandleRunningInstance(instance);
- }
- }
- /// <summary>
- /// 获取当前是否具有相同进程。
- /// </summary>
- /// <returns></returns>
- public static Process GetRunningInstance()
- {
- Process current = Process.GetCurrentProcess();
- Process[] processes = Process.GetProcessesByName(current.ProcessName);
- //遍历正在有相同名字运行的例程
- foreach (Process process in processes)
- {
- //忽略现有的例程
- if (process.Id != current.Id)
- //确保例程从EXE文件运行
- if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/" , "\\") == current.MainModule.FileName )
- return process;
- }
- return null;
- }
- /// <summary>
- /// 激活原有的进程。
- /// </summary>
- /// <param name="instance"></param>
- public static void HandleRunningInstance(Process instance)
- {
- ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
- SetForegroundWindow(instance.MainWindowHandle);
- }
- }
- }