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

标签 c# winforms

我想编写 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);
        }
}

关于c# - 在 C# 中切换应用程序,如任务管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15638531/

相关文章:

c# - 如何在 GridMvc 中设置列​​文本颜色

c# - ListBox 和 Datasource - 防止第一项被选中

c# - 对基类强制执行重写方法

c# - 如何将 ODP.NET 集成到存储库类中?

c# - 在 WCF 服务中发送具有从同一父级派生的不同类的对象列表

c# - 如何在更新列时暂停 DataGridView

c# - 在我的 winform 应用程序中获取 rdlc 报告的相对路径

c# - 仅使用 DropDown 进行 DateTimePicker 选择

winforms - 在 Beta 测试期间检测异常

c# - 从模式中的部分获取数据元素,用Javascript设置父级中文本框的值?