zoukankan      html  css  js  c++  java
  • WinForm程序,实现只启动一个实例

    前言:在我们做的软件中,当点击图标运行时,正常的需求是只需要启动一个软件的实例,这是非常重要的一点,不然就显得我们的软件非常的山寨,笔者在工作中经常遇到同事没有注意这一点,看似不重要,实则为非常的重要的一点,这里利用C#实现单实例的模式。


    注:代码需写在Program.cs中,具体代码如下:

     1 static class Program
     2 {
     3 
     4         /// <summary>
     5         /// 该函数设置由不同线程产生的窗口的显示状态。
     6         /// </summary>
     7         /// <param name="hWnd">窗口句柄</param>
     8         /// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分。</param>
     9         /// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零。</returns>
    10         [DllImport("User32.dll")]
    11         private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    12         /// <summary>
    13         /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
    14         /// </summary>
    15         /// <param name="hWnd">将被激活并被调入前台的窗口句柄。</param>
    16         /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。</returns>
    17         [DllImport("User32.dll")]
    18         private static extern bool SetForegroundWindow(IntPtr hWnd);
    19         private const int WS_SHOWMAXIMIZE = 3;  //最大化显示窗口
    20         private const int WS_SHOW = 5;//以原来大小和位置显示
    21 
    22 
    23         /// <summary>
    24         /// 应用程序的主入口点。
    25         /// </summary>
    26         [STAThread]
    27         static void Main()
    28         {
    29             Application.EnableVisualStyles();
    30             Application.SetCompatibleTextRenderingDefault(false);
    31 
    32             Process instance = RunningInstance();
    33 
    34             if (instance == null)
    35             {
    36                 LoginForm lf = new LoginForm();
    37                 lf.ShowDialog();
    38                 if (lf.DialogResult == DialogResult.OK)
    39                     Application.Run(new SelectItemForm());
    40             }
    41             else
    42             {
    43                 HandleRunningInstance(instance);
    44 
    45             }
    46 
    47         }
    48 
    49 
    50         /// <summary>
    51         /// 获取正在运行的实例,没有运行的实例返回null;
    52         /// </summary>
    53         public static Process RunningInstance()
    54         {
    55             Process current = Process.GetCurrentProcess();
    56             Process[] processes = Process.GetProcessesByName(current.ProcessName);
    57             foreach (Process process in processes)
    58             {
    59                 if (process.Id != current.Id)
    60                 {
    61                     if (process.MainModule.FileName == current.MainModule.FileName)
    62                     {
    63                         return process;
    64                     }
    65                 }
    66             }
    67             return null;
    68         }
    69 
    70         /// <summary>
    71         /// 显示已运行的程序。
    72         /// </summary>
    73         public static void HandleRunningInstance(Process instance)
    74         {
    75             if (CONSTANTDEFINE.LOGIN == 1)  //笔者这里根据实际情况,进行了控制
    76                 ShowWindowAsync(instance.MainWindowHandle, WS_SHOWMAXIMIZE); //显示,通过后面的值可以对窗口大小进行控制
    77             else
    78                 ShowWindowAsync(instance.MainWindowHandle, WS_SHOW);
    79 
    80             SetForegroundWindow(instance.MainWindowHandle);            //放到前端
    81         }
    82     }

    通过以上代码,就可以实现,程序只启动一次,而不是每次点击都会进行一个实例化。


    by Shawn Chen,2017.7.10 日,晚。

  • 相关阅读:
    js 数据结构-栈与队列
    mysql (已解决)Access denied for user 'root'@'localhost' (using password: NO)
    mysql (已解决p)MYSQL5.7启动不了,本地计算机上的 MySQL57 服务启动后停止。
    mysql 慢查询日志,灾难日志恢复,错误日志
    php json的相关操作
    (转)LitJson 遍历key
    (转)用Eclipse进行C++开发时Bianry not found的问题解决
    (转) 在Eclipse中进行C/C++开发的配置方法(20140721最新版)
    (转)如何在eclipse的配置文件里指定jdk路径
    (转)mongodb分片
  • 原文地址:https://www.cnblogs.com/developer_chan/p/7147869.html
Copyright © 2011-2022 走看看