C# Windows程序窗口置前台的几种方法
这个是从别的地方看来的,放我这里
第一种:SetForegroundWindow,这个方法时灵时不灵。有人说,在自己的程序里把自己的窗口之前一般就不灵,而置前其它程序的窗口就灵。我觉得这是有原因的:当一个程序运行这个函数的时候,我们可以想象,如果是用鼠标操作,那么当前窗口实际上正在操作,很可能在瞬间离开后,焦点又回来了,那么看上去更就没有吧其它窗口置前的效果,所以这个函数内部可能做了延迟,略等一下,在这个时间内,当前窗口不会被置前。就是这个时间,函数已经调用完成,所以看上去,自己的窗口并没有置前。
第二种:SwitchToThisWindow,这个方法很好使,还会把最小化的窗口复原。但是Windows说,这个函数以后可能不支持。但是我觉得可以放心使用,Windows当前一般就那几个版本,程序不会计划运行100年不升级吧。这个函数可以直接链接,但是XP以前的版本可能不行,所以,使用动态加载可能保险点。动态加载代码:
- typedef void (WINAPI*PROCSWITCHTOTHISWINDOW)(HWND,BOOL);
- PROCSWITCHTOTHISWINDOW SwitchToThisWindow;
- HMODULE hUser32 = GetModuleHandle(L"user32");
- SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32,"SwitchToThisWindow");
- SwitchToThisWindow(frame,1);
第三种方法:BringWindowToTop,这个函数比上一个功能少点,实质是调用SetWindowPos函数。
我的具体用法是这样子
//[DllImport("user32.dll")]
//public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll ", SetLastError = true)]
static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
//[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
//public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
public const int SW_RESTORE = 9;
public static IntPtr formhwnd;
Process[] MyProcesses = Process.GetProcesses();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WorkingDirectory = @"D:\开发区工作\钢筋软件\开发资料\2017\源代码\MTC部分\廊坊凯博\KBMES\";
startInfo.FileName = "Client.exe";
bool temp = false;
foreach (Process MyProcess in MyProcesses)
{
if (MyProcess.ProcessName == "Client")
{
//IntPtr handle = MyProcess.MainWindowHandle;
//ShowWindow(handle,1);
temp = true;
SwitchToThisWindow(MyProcess.MainWindowHandle,true);
break;
}
}
if (temp == false)
Process.Start(startInfo);
后面还看到
SwitchToThisWindow这个是遗留函数,也就是微软为了和以前版本windows兼容而留下来的,以后的版本可能会被移除。
SetForegroundWindow就是推荐的函数。
SetActiveWindow这三者有什么区别和联系 SetActiveWindow不能激活后台程序,也就是窗口被隐藏了,不能用它激活。
ShowWindow的API函数是显示窗口,
它的第二个参数是决定窗体的状态的。
| Value | Meaning |
|---|---|
|
Minimizes a window, even if the thread that owns the window is not responding. This flag should only be used when minimizing windows from a different thread. |
|
Hides the window and activates another window. |
|
Maximizes the specified window. |
|
Minimizes the specified window and activates the next top-level window in the Z order. |
|
Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window. |
|
Activates the window and displays it in its current size and position. |
|
Sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application. |
|
Activates the window and displays it as a maximized window. |
|
Activates the window and displays it as a minimized window. |
|
Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated. |
|
Displays the window in its current size and position. This value is similar to SW_SHOW, except that the window is not activated. |
|
Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except that the window is not activated. |
|
Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time. |
好吧,这些都在C#用到了非托管类的API了,不知道VS里面的类有没有这样的功能。
C# Windows程序窗口置前台的几种方法的更多相关文章
- VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法
原文:VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/ ...
- VC.【转】窗口置于前台并激活的方法
1.VC 窗口置于前台并激活的方法 - CSDN博客.html https://blog.csdn.net/oXunFeng/article/details/52681279 2.(http://ww ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- Duilib改进窗口拖动,使整个窗口都能拖动两种方法(转载)
转载:http://www.cnblogs.com/XiHua/articles/3490490.html 转载:http://blog.csdn.net/lostspeed/article/deta ...
- 体温数据上传程序开发+获取时间的三种方法+DB Browser下载及安装
今天开始了体温上传程序的开发 今日所学: 获取时间 (21条消息) (转)安卓获取时间的三种方法_sharpeha的博客-CSDN博客_安卓获取时间 DB Browser安装教程 (20条消息) sq ...
- java web 程序---内置对象application的log方法的使用
application的主要方法里,有log方法,是日志文件里可以查看到信息的. 当老师写好代码后,他发现在tomact里的log目录下找不到信息,原因是:我们用myeclipse这个客户端软件,应该 ...
- 将Java程序作成exe文件的几种方法【转载】
看到网上有同志的介绍将Java程序作成exe文件的方法,写的不错,但是也许是这篇文章完成的时间比较早,许多内容已经不合适了.我在这里补充几条: 一.exe4j 说明:exe4j可以将Jar文件制作成e ...
- qt客户端程序使用svg图片资源的几种方法
直接使用svg格式文件资源的情况 1. 直接在UI控件属性面板中选择部分支持icon图标的控件的icon来源,这样图标可以显示 2.给toolbutton添加样式 qproperty-icon: ur ...
- C#程序读取MAC地址的五种方法(转)
public class GetMac { ///<summary> /// 根据截取ipconfig /all命令的输出流获取网卡Mac ///</summary> ///& ...
随机推荐
- C# 不添加WEB引用调用WSDL接口
在项目中添加WEB引用耦合度较高,更新时要更新引用,所以我建议不添加WEB引用调用WSDL接口,废话不多说,直接上代码 例如WSDL地址为:http://XXX.XX.XXX.XXX:9115/WsP ...
- UWP 响应键盘组合快捷键
方法1:响应Ctrl+?快捷键 首先在load事件或者keydown事件内注册事件 public MainPage() { this.InitializeComponent(); // Registe ...
- iOS-项目开发1-图片浏览器
FFBrowserImageViewController 自定义的图片浏览器:支持图片双击放大,单击取消,拖动取消. 重点: 1:在iOS11之后再布局是要将UIScrollViewContentIn ...
- PHP程序员职业发展路线
重点:把LNMP搞熟练(核心是安装配置基本操作) 1.Linux: 基本命令.操作.启动.基本服务配置(包括rpm安装文件,各种服务配置等): 会写简单的shell脚本和awk/sed 脚本命令等. ...
- mysql存储过程双重循环示例
BEGIN ); DECLARE done INT DEFAULT FALSE; DECLARE cursor_rule CURSOR FOR SELECT s.id FROM d_menu_type ...
- Python小白学习之路(二十四)—【装饰器】
装饰器 一.装饰器的本质 装饰器的本质就是函数,功能就是为其他函数添加附加功能. 利用装饰器给其他函数添加附加功能时的原则: 1.不能修改被修饰函数的源代码 2.不能修改被修饰函数的调用 ...
- @RequestParam注解
SpringMVC的参数指定注解:@RequestParam,有下面四个方法: value 参数绑定,value里写的是URL里参数名称 name 同上 required 是否必需参数,默认为tr ...
- 使用控制台程序搭建OAuth授权服务器
参考地址:ASP.NET Web Api: Understanding OWIN/Katana Authentication/Authorization Part I: Concepts 先上一张OA ...
- charles重复发包工具/repeat
重复发包工具/repeat Charles 让你选择一个请求并重复,在测试后端接口的时候非常有用: Charles将请求重新发送到服务器,并将响应显示为新请求. 如果您进行后端更改并希望测试它们,用了 ...
- android app性能优化大汇总(google官方Android性能优化典范 - 第3季)
(1)Fun with ArrayMaps 程序内存的管理是否合理高效对应用的性能有着很大的影响,有的时候对容器的使用不当也会导致内存管理效率低下.Android为移动操作系统特意编写了一些更加高效的 ...