【C#】重新拉起程序并显示在最前面
1.封装windows API类
/// <summary>
/// 封装Windows API的类
/// </summary>
public class WindowAPIMethodsUtility
{
public const int WM_USER = 0x400;
public const int WM_SHOWMYMAINWINDOW = WM_USER + 1;
public const int HWND_BROADCAST = 0xffff;
#region 窗体显示
//隐藏窗口并激活另一个窗口
public const int SW_HIDE = 0;
//激活并显示窗口。 如果窗口最小化、最大化或排列,系统会将其还原到其原始大小和位置
public const int WS_SHOWNORMAL = 1;
//激活窗口并将其显示为最小化窗口
public const int SW_SHOWMINIMIZED = 2;
//激活窗口并显示最大化的窗口
public const int SW_SHOWMAXIMIZED = 3;
//以最近的大小和位置显示窗口
public const int SW_SHOWNOACTIVATE = 4;
//激活窗口并以当前大小和位置显示窗口
public const int SW_SHOW = 5;
//最小化指定的窗口,并按 Z 顺序激活下一个顶级窗口
public const int SW_MINIMIZE = 6;
//将窗口显示为最小化窗口。 此值类似于 SW_SHOWMINIMIZED,但窗口未激活
public const int SW_SHOWMINNOACTIVE = 7;
//以当前大小和位置显示窗口。 此值类似于 SW_SHOW,只是窗口未激活
public const int SW_SHOWNA = 8;
//激活并显示窗口。 如果窗口最小化、最大化或排列,系统会将其还原到其原始大小和位置
public const int SW_RESTORE = 9;
//根据启动应用程序的程序传递给 CreateProcess 函数的 STARTUPINFO 结构中指定的SW_值设置显示状态
public const int SW_SHOWDEFAULT = 10;
//最小化窗口,即使拥有窗口的线程没有响应。 仅当最小化不同线程的窗口时,才应使用此标志。
public const int SW_FORCEMINIMIZE = 11;
#endregion
[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string? lpClassName, string lpWindowName);
[DllImport("user32.dll ")]
//设置窗体置顶
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("User32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
}
2.拉起软件并显示在窗体最前面
//软件进程名称
string MutexName="Demo";
/// <summary>
/// 有程序运行,设置焦点
/// </summary>
private void Focus()
{
foreach (Process process in Process.GetProcesses())
{
try
{
if (process.ProcessName.ToLower() != MutexName.ToLower())
continue;
IntPtr hwnd = process.MainWindowHandle;
if (hwnd != IntPtr.Zero)
{
//重新拉起程序并显示最前
WindowAPIMethodsUtility.ShowWindow(hwnd, WindowAPIMethodsUtility.SW_SHOWMAXIMIZED);
WindowAPIMethodsUtility.SetForegroundWindow(hwnd);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}