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 = )
{
ShowWindow(a_ptr, ); //设置窗体大小 1为正常 2为最小化 3 为最大化
SetWindowPos(a_ptr, -, , , , , SWP_NOSIZE | SWP_NOMOVE); //最后参数也有用1 | 4
SetForegroundWindow(a_ptr);
}
C# WinForm API 改进单实例运行的更多相关文章
- WinForm 登录窗体 + 单实例运行
关于怎么在winform里增加登录窗体或者如何让winform程序单实例运行网上都很多例子. 然而两者结合起来呢? //Program.cs static class Program { public ...
- Winform 单实例运行
Winform 单实例运行 前言 前两天在博客园看到<如何防止程序多次运行>,文章写的很好,最后还留下一个问题给我们思考.关于Winform的防止多次运行,曾经也想研究过,但是后来工作上没 ...
- DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法
原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...
- Qt实现应用程序单实例运行--LocalServer方式
使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...
- Windows进程单实例运行
场景 Windows进程单实例运行,如果有进程没有退出,继续等待,直到进程完全退出,才会进入下一个实例 HANDLE pHandle = NULL; do { pHandle = ...
- C#实现单实例运行
C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 ...
- C++实现程序单实例运行的两种方式
简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫 ...
- c#设计应用程序单实例运行
利用WindowsFormsApplicationBase的IsSingleInstance来控制应用程序只能单实例运行. [DllImport("user32.dll", Ent ...
- c# 单实例运行
/// <summary> /// 单实例运行程序 /// </summary> static void SingleInstanceRun() { bool isAppRun ...
随机推荐
- SAH Benchmarks Of Natural History Museum Scene
method ...
- Eclipse中mvn install 报错error in opening zip file
报错信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (de ...
- linux命令之进程管理命令
1.ps:查看进程 该命令用于列出命令执行时刻的进程快照,如果想要动态的显示进程信息,可以使用top命令. 参数 说明 a(常用) 显示与终端相关的所有进程,包含每个进程的完整路径 x(常用) 显示与 ...
- 求解任意图的最小支配集(Minimun Dominating Set)
给定一个无向图G =(V,E),其中V表示图中顶点集合,E表示边的集合.G的最小控制顶点集合为V的一个子集S∈V:假设集合R表示V排除集合S后剩余顶点集合,即R∩S=∅,R∪S=V:则最小控制顶点集合 ...
- WEB新手之sql注入
继续写题. 这题看上去是一道sql注入题.F12查看后台代码. 可以看到后台有两个变量,分别是uname以及passwd.然后接下来读一下后台的代码,这里的意思是,如果用户输入的密码经过md5加密后, ...
- Cookie、Session的具体使用
定义 保存在客户端浏览器的键值对. 作用场景 1.登录校验 2.保存用户的一些偏好信息 Cookie的查询 查询所有的Cookie信息: request.COOKIES 完整的Cookie信息就是一个 ...
- Vs.net 常用命令行
下面的是从 devenv /? 看到的 用法: devenv [解决方案文件 | 项目文件 | 任意文件.扩展名] [开关] devenv 的第一个参数通常是一个解决方案文件或项目文件. 如果 ...
- js实现checkbox全选,全部选和反选效果
效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Source Insight 查看函数调用关系
研究海思SAMPLE时,使用Source Insight查看源码,函数调用关系查看: 选中一个函数,右键选择"Show in Relation Window" 显示界面的相关设置: ...
- history.back返回是浏览器错误码:ERR_CACHE_MISS
解决方法: 如果访问的是php文件中添加:header("Cache-control: private"); 如果使用的是模板引擎(tp5):{php}header("C ...