【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);
        }
    }
}
posted @ 2024-09-27 09:34  qiutian-hao  阅读(20)  评论(0编辑  收藏  举报