这个是从别的地方看来的,放我这里

第一种:SetForegroundWindow,这个方法时灵时不灵。有人说,在自己的程序里把自己的窗口之前一般就不灵,而置前其它程序的窗口就灵。我觉得这是有原因的:当一个程序运行这个函数的时候,我们可以想象,如果是用鼠标操作,那么当前窗口实际上正在操作,很可能在瞬间离开后,焦点又回来了,那么看上去更就没有吧其它窗口置前的效果,所以这个函数内部可能做了延迟,略等一下,在这个时间内,当前窗口不会被置前。就是这个时间,函数已经调用完成,所以看上去,自己的窗口并没有置前。

第二种:SwitchToThisWindow,这个方法很好使,还会把最小化的窗口复原。但是Windows说,这个函数以后可能不支持。但是我觉得可以放心使用,Windows当前一般就那几个版本,程序不会计划运行100年不升级吧。这个函数可以直接链接,但是XP以前的版本可能不行,所以,使用动态加载可能保险点。动态加载代码:

  1. typedef void (WINAPI*PROCSWITCHTOTHISWINDOW)(HWND,BOOL);
  2. PROCSWITCHTOTHISWINDOW SwitchToThisWindow;
  3. HMODULE hUser32 = GetModuleHandle(L"user32");
  4. SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32,"SwitchToThisWindow");
  5. 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
SW_FORCEMINIMIZE
11

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.

SW_HIDE
0

Hides the window and activates another window.

SW_MAXIMIZE
3

Maximizes the specified window.

SW_MINIMIZE
6

Minimizes the specified window and activates the next top-level window in the Z order.

SW_RESTORE
9

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.

SW_SHOW
5

Activates the window and displays it in its current size and position.

SW_SHOWDEFAULT
10

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.

SW_SHOWMAXIMIZED
3

Activates the window and displays it as a maximized window.

SW_SHOWMINIMIZED
2

Activates the window and displays it as a minimized window.

SW_SHOWMINNOACTIVE
7

Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.

SW_SHOWNA
8

Displays the window in its current size and position. This value is similar to SW_SHOW, except that the window is not activated.

SW_SHOWNOACTIVATE
4

Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except that the window is not activated.

SW_SHOWNORMAL
1

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程序窗口置前台的几种方法的更多相关文章

  1. VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法

    原文:VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/ ...

  2. VC.【转】窗口置于前台并激活的方法

    1.VC 窗口置于前台并激活的方法 - CSDN博客.html https://blog.csdn.net/oXunFeng/article/details/52681279 2.(http://ww ...

  3. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  4. Duilib改进窗口拖动,使整个窗口都能拖动两种方法(转载)

    转载:http://www.cnblogs.com/XiHua/articles/3490490.html 转载:http://blog.csdn.net/lostspeed/article/deta ...

  5. 体温数据上传程序开发+获取时间的三种方法+DB Browser下载及安装

    今天开始了体温上传程序的开发 今日所学: 获取时间 (21条消息) (转)安卓获取时间的三种方法_sharpeha的博客-CSDN博客_安卓获取时间 DB Browser安装教程 (20条消息) sq ...

  6. java web 程序---内置对象application的log方法的使用

    application的主要方法里,有log方法,是日志文件里可以查看到信息的. 当老师写好代码后,他发现在tomact里的log目录下找不到信息,原因是:我们用myeclipse这个客户端软件,应该 ...

  7. 将Java程序作成exe文件的几种方法【转载】

    看到网上有同志的介绍将Java程序作成exe文件的方法,写的不错,但是也许是这篇文章完成的时间比较早,许多内容已经不合适了.我在这里补充几条: 一.exe4j 说明:exe4j可以将Jar文件制作成e ...

  8. qt客户端程序使用svg图片资源的几种方法

    直接使用svg格式文件资源的情况 1. 直接在UI控件属性面板中选择部分支持icon图标的控件的icon来源,这样图标可以显示 2.给toolbutton添加样式 qproperty-icon: ur ...

  9. C#程序读取MAC地址的五种方法(转)

    public class GetMac { ///<summary> /// 根据截取ipconfig /all命令的输出流获取网卡Mac ///</summary> ///& ...

随机推荐

  1. Python--多线程处理

    python中有好几种多线程处理方式,更喜欢使用isAlive()来判断线程是否存活,笔记一下,供以后查找 # coding: utf-8 import sys, time import thread ...

  2. 数据库操作类《SqlHelper》

    一.背景 在看了一本书叫<Visual Studio 2010(C#)Windows数据库项目开发>后,觉得很多编程技术需要积累,因为一个简单的项目里包含的技术太多了,容易忘记.每次需要用 ...

  3. 迁移桌面程序到MS Store(2)——Desktop App Converter

    迁移传统桌面程序到MS Store的另一种方式是使用Desktop App Converter工具.虽然本篇标题包含了Desktop App Converter(以下简称DAC),实际上我是来劝你别用 ...

  4. Python2.7更新pip:UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position 7: ordinal not in range(128)

    1.首先更新pip版本的时候出现.这是出现在python2.7.16出现的问题 2.进入你的pyhton目录下的Lib\mimetypes.py 打开它 3.在import下面加入这代码 if sys ...

  5. LVS健康检查脚本

    #!/bin/bash #============================================================================= VIP=10.10 ...

  6. python中a,b=b,a原理

    python中 a , b = b , a 可以将  a  和  b  的值交换 >>> a = 1 >>> b = 2 >>> a , b = ...

  7. cookie和session的区别,分布式环境怎么保存用户状态

    cookie和session的区别,分布式环境怎么保存用户状态 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以分析存放在本地的COOK ...

  8. 理解WSGI

    WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义 ...

  9. Microsoft SQL Server on Linux 踩坑指南

    微软用 SQL Server 在 2016 年的时候搞了一个大新闻,宣传 Microsoft ❤️ Linux 打得一众软粉措手不及.但是这还是好事情,Linux 上也有好用的 SQL Server ...

  10. (转)Cognos的下载地址分享

    原文:https://blog.csdn.net/Wikey_Zhang/article/details/76138965 刚开始接触Cognos,发现Cognos真是一款挺不错的报表工具,先分享一下 ...