C# WinForm API 改进单实例运行

 

在普通的单实例中,第二次点击软件快捷方式的时候,往往简单提示"系统已经运行",而不是把第一次打开的软件主窗体显示出来,下面演示如果主窗体已经打开则把第一次打开的主窗体放置到最前面;

 

第一步 通过Spy++ 找到窗体句柄和标题:

在寻找窗体句柄时,一般会有下面几种情况:

1.知道类名称和窗体名称,这种是最简单的

2.知道类名称,知道主窗体的名称一部分,但主窗体名称会发生改变

3.不知道类名称,只知道窗体名称,这个时候判断条件只判断名称

4.只知道类名称,不知道窗体名称 这个时候窗体名称设置为Null

 

第二步 在程序的入口添加单实例判断,如果已经存在该程序,则找到原来程序句柄并打开,这里我默认的是最大化窗体,可以直接修改参数,是最大化还是常规模式;

下面有完整的源码下载!

 

补充:这个功能也可以移植主界面作为热键;

具体参考华聪老师的博客:

http://www.cnblogs.com/wuhuacong/archive/2011/10/13/2211008.html

 

 

       /// <summary>
        /// 查找窗体句柄 遍历所有窗体
        /// 因为类名称相同的窗体很多
        /// </summary>
        /// <param name="a_strClassName">类名称</param>
        /// <param name="a_strWindowName">窗体名称 因为有时候窗体名称会变动,所以传递前面一部分值 或者整个值  </param>
        /// <returns></returns>
        public static IntPtr FindWindowExPtr(string a_strClassName, string a_strWindowName)
        {
            CSharpAPIsDemo aa = new CSharpAPIsDemo();
            CSharpAPIsDemo.WindowInfo[] wf = aa.GetAllDesktopWindows();
            foreach (CSharpAPIsDemo.WindowInfo info in wf)
            {
                if (info.szClassName == a_strClassName && info.szWindowName.Contains(a_strWindowName))
                {
                    return info.hWnd;
                }
            }
            return IntPtr.Zero;
        }


 

  /// <summary>
        /// 窗体最大化
        /// </summary>
        /// <param name="a_ptr">窗体句柄</param>
        /// <param name="a_intState">1为正常 2为最小化 3 为最大化</param>
        public static void SetFormMax(IntPtr a_ptr, int a_intState = 3)
        {
            ShowWindow(a_ptr, 3); //设置窗体大小 1为正常 2为最小化 3 为最大化
            SetWindowPos(a_ptr, -1, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); //最后参数也有用1 | 4
            SetForegroundWindow(a_ptr);
        }

 

 点击推荐后下载完整代码

 

posted @ 2016-01-05 17:44  maanshancss  阅读(318)  评论(0编辑  收藏  举报