海滨小城

.net研究

导航

如何让应用程序只有一个实例在运行?

MyForm.cs

using System; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Diagnostics; using System.Reflection; public class OneInstnace { [STAThread] public static void Main() { //得到正在运行的例程 Process instance = RunningInstance(); if (instance == null) { //如果没有其它例程,就新建一个窗体 Application.Run (new Form()); } else { //处理发现的例程 HandleRunningInstance(instance); } } public static Process RunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName (current.ProcessName); //遍历正在有相同名字运行的例程 foreach (Process process in processes) { //忽略现有的例程 if (process.Id != current.Id) { //确保例程从EXE文件运行 if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) { //返回另一个例程实例 return process; } } } //没有其它的例程,返回Null return null; } public static void HandleRunningInstance(Process instance) { //确保窗口没有被最小化或最大化 ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL); //设置真实例程为foreground window SetForegroundWindow (instance.MainWindowHandle); } [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; }

posted on 2012-06-03 15:31  海滨小城  阅读(182)  评论(0编辑  收藏  举报