首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

WinForm软件怎么只启动一次

2012-10-20 
WinForm软件如何只启动一次。我现在用C#开发了一个软件,想实现如下效果:第一次启动软件时软件顺利启动,把软

WinForm软件如何只启动一次。
我现在用C#开发了一个软件,想实现如下效果:
第一次启动软件时软件顺利启动,把软件界面最小化再启动软件,只是把之前最小化的界面再弹出来,不再新启动软件。
就像360软件一样的效果。
代码如下:

C# code
 /// <summary>        /// 应用程序的主入口点。        /// </summary>        [STAThread]        static void Main()        {            bool bRun = true;            System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out bRun);            if (bRun)            {                Application.EnableVisualStyles();                Application.SetCompatibleTextRenderingDefault(false);                Application.Run(new MainForm());            }            else            {                //这里应该怎么写呢?            }        }


[解决办法]
互斥体,信号量,还有判断进程名称,比如
C# code
            string name = Process.GetCurrentProcess().ProcessName;            int id = Process.GetCurrentProcess().Id;            foreach (Process p in Process.GetProcesses())            {                if (name == p.ProcessName && id != p.Id)                //if (name == p.ProcessName)                {                    MessageBox.Show("你已经打开了此系统, 请先关闭!", string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Warning);                    return;                }            }
[解决办法]

[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
private const int SW_RESTORE = 9;
public static bool RunSingleInstance()
{
string proc = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(proc);
if (processes.Length > 1)
{
Process p = Process.GetCurrentProcess();
int n = 0;
if (processes[0].Id == p.Id)
{
n = 1;
}
IntPtr hWnd = processes[n].MainWindowHandle;
if (IsIconic(hWnd))
{
ShowWindowAsync(hWnd, SW_RESTORE);
}
SetForegroundWindow(hWnd);
return false;
}
return true;
}

[解决办法]
C# code
主要用到两个API 函数:ShowWindowAsync 该函数设置由不同线程产生的窗口的显示状态。SetForegroundWindow 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。代码如下:引用以下命名空间:using System.Runtime.InteropServices;using System.Diagnostics;using System.Reflection;//*****************************************************  static class Program     {         /// <summary>         /// 该函数设置由不同线程产生的窗口的显示状态。         /// </summary>         /// <param name="hWnd">窗口句柄</param>         /// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分。</param>         /// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零。</returns>         [DllImport("User32.dll")]         private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);         /// <summary>         /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。         /// </summary>         /// <param name="hWnd">将被激活并被调入前台的窗口句柄。</param>         /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。</returns>         [DllImport("User32.dll")]         private static extern bool SetForegroundWindow(IntPtr hWnd);         private const int WS_SHOWNORMAL = 1;        /// <summary>         /// 应用程序的主入口点。         /// </summary>         [STAThread]         static void Main()         {             Application.EnableVisualStyles();             Application.SetCompatibleTextRenderingDefault(false);             Process instance = RunningInstance();             if (instance == null)             {                 Form1 frm = new Form1();                 Application.Run(new Form1());             }             else             {                 HandleRunningInstance(instance);             }        }         /// <summary>         /// 获取正在运行的实例,没有运行的实例返回null;         /// </summary>         public static Process RunningInstance()         {             Process current = Process.GetCurrentProcess();             Process[] processes = Process.GetProcessesByName(current.ProcessName);             foreach (Process process in processes)             {                 if (process.Id != current.Id)                 {                     if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)                     {                         return process;                     }                 }             }             return null;         }        /// <summary>         /// 显示已运行的程序。         /// </summary>         public static void HandleRunningInstance(Process instance)         {             ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); //显示,可以注释掉             SetForegroundWindow(instance.MainWindowHandle);            //放到前端         }     } 

热点排行