C# 类c任务管理器中的开关应用

C# 类c任务管理器中的开关应用,c#,winforms,C#,Winforms,我想编写c#应用程序,它将在一些正在运行的应用程序之间切换。它应该具有与windows中的Alt+Tab完全相同的功能。我使用Windows API中的SetForegroundWindow()函数,但如果在Windows任务栏上最小化应用程序,则该函数无法正常工作。因此,我添加了ShowWindow()函数,但有一个问题是,我无法以用户设置的原始大小显示窗口 [DllImport("user32.dll")] public static extern bool SetForegroundWin

我想编写c#应用程序,它将在一些正在运行的应用程序之间切换。它应该具有与windows中的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
参数,但结果相同。

我以前做过这样的操作,您希望获得打开的所有内容的列表,最小化所有内容,然后再次迭代,将每个程序与要还原的程序进行比较,然后还原该程序。你需要一种方法来识别你想要恢复的一个窗口,我曾经使用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);
        }
}

你试过软件恢复吗?是的,我试过软件恢复。然后,先最大化后最小化的应用程序显示为未最大化(如预期)。它显示为窗口,其大小低于屏幕的最大大小。我不想每次都将窗口最大化。我想在使用另一个窗口隐藏窗口之前或在将其最小化到任务栏之前,以相同的状态显示窗口…我已更新了答案,您需要向ShowWindow方法提供值9以恢复原始状态。@JMK:9等于
SW_restore
,因此这不是解决方案。。。嗯,我想你是对的。只有一个小缺点。如果我不最小化我的窗口并调用此代码,最大化的窗口将恢复为非最小和非最大化大小。也许应该有这样的代码:
if(最小化){ShowWindow(process.MainWindowHandle,9);}else{SetForegroundWindow(processWindowHandle);}