在c#中切换应用程序,如任务管理器

本文关键字:任务管理器 应用程序 | 更新日期: 2023-09-27 18:06:08

我想写一个c#应用程序,可以在一些正在运行的应用程序之间切换。它应该做的功能像窗口中的Alt+Tab。我使用来自Windows API的SetForegroundWindow()函数,但是如果应用程序在Windows任务栏上最小化,它就不能很好地工作。所以我增加了ShowWindow()功能,但有一个问题,我不可能显示窗口的原始大小,用户设置。

[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

示例:我最大化窗口,然后最小化它到任务栏。当我呼叫:

ShowWindow(processWindowHandle, ShowWindowCmd.SW_NORMAL);
WindowsApi.SetForegroundWindow(processWindowHandle);

窗口没有最大化。我试着玩ShowWindowCmd.SW_NORMAL参数,但结果相同。

在c#中切换应用程序,如任务管理器

我以前这样做过,您想要打开所有内容的列表,最小化所有内容,然后再次遍历该列表,将每个程序与要恢复的程序进行比较,然后恢复那个程序。您需要一种方法来识别您想要恢复的窗口,我过去使用MainWindowTitle,因为我可以控制环境,因此可以保证每个MainWindowTitle都是唯一的,您可能没有这种奢侈。

我过去使用的代码如下,它工作得很好:

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
void SwitchDatabase(string mainWindowTitle)
{
        try
        {
            bool launched = false;
            Process[] processList = Process.GetProcesses();
            foreach (Process theProcess in processList)
            {
                ShowWindow(theProcess.MainWindowHandle, 2);
            }
            foreach (Process theProcess in processList)
            {
                if (theProcess.MainWindowTitle.ToUpper().Contains(mainWindowTitle.ToUpper()))
                {
                    ShowWindow(theProcess.MainWindowHandle, 9);
                    launched = true;
                }
            }
        }
        catch (Exception ex)
        {
            ThrowStandardException(ex);
        }
}