C# WinForm API 改进单实例运行
2016-01-05 17:44
344 查看
在普通的单实例中,第二次点击软件快捷方式的时候,往往简单提示"系统已经运行",而不是把第一次打开的软件主窗体显示出来,下面演示如果主窗体已经打开则把第一次打开的主窗体放置到最前面;
第一步 通过Spy++ 找到窗体句柄和标题:
在寻找窗体句柄时,一般会有下面几种情况:
1.知道类名称和窗体名称,这种是最简单的
2.知道类名称,知道主窗体的名称一部分,但主窗体名称会发生改变
3.不知道类名称,只知道窗体名称,这个时候判断条件只判断名称
4.只知道类名称,不知道窗体名称 这个时候窗体名称设置为Null
第二步 在程序的入口添加单实例判断,如果已经存在该程序,则找到原来程序句柄并打开,这里我默认的是最大化窗体,可以直接修改参数,是最大化还是常规模式;
下面有完整的源码下载!
补充:这个功能也可以移植主界面作为热键;
具体参考华聪老师的博客:
http://www.cnblogs.com/wuhuacong/archive/2011/10/13/2211008.html
点击推荐后下载完整代码
第一步 通过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); }
点击推荐后下载完整代码
相关文章推荐
- 【C#——揭开你的面纱】
- C# 原样复制excel工作表
- C# 原样复制excel工作表
- c# 将秒数转换成时,分,秒的方法
- C#添加本地打印机
- C# Winform下载文件并显示进度条
- C# 序列化
- C# 序列化
- C#之宏观了解
- C#中Stream和Byte[]互相转换
- C#多线程编程
- C#向并口设备发送指令以获取并口设备的状态
- datatable绑定comboBox显示数据[C#]
- c#截取字符串
- 根据先序、中序、后序中的两者还原二叉树——递归函数和Csharp泛型
- C#中Math.Round()实现中国式四舍五入
- C#static与readonly与const的使用环境
- c#的自定义控件中的属性像Items一样打开一个form的做法
- C# 用OO来实现超市的购买结账
- 【C#】Color颜色对照表