【问题标题】:Switch application in c# like task manager在 c# 中切换应用程序,如任务管理器
【发布时间】:2013-03-26 13:40:39
【问题描述】:

我想编写一个可以在一些正在运行的应用程序之间切换的 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 参数,但结果相同。

【问题讨论】:

  • 你试过SW_RESTORE吗?
  • 是的,我尝试了 SW_RESTORE。最大化然后最小化的应用程序然后显示为未最大化(如预期的那样)。它显示为小于屏幕最大尺寸的窗口。
  • 我不想每次都最大化窗口。我想以与另一个窗口隐藏窗口之前或将其最小化到任务栏之前相同的状态显示窗口...
  • 我已经更新了我的答案,您需要将值 9 提供给 ShowWindow 方法以恢复原始状态。
  • @JMK: 9 等于SW_RESTORE,所以这不是解决方案...msdn.microsoft.com/en-us/library/windows/desktop/…

标签: c# winforms


【解决方案1】:

我以前做过这个,你想得到一个打开所有东西的列表,最小化所有东西,然后再次遍历它,将每个程序与你想要恢复的程序进行比较,然后恢复那个程序。您需要一种方法来确定要恢复的窗口,我曾经使用 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);
        }
}

【讨论】:

  • 嗯。你是对的,我想。只有一个小缺点。如果我不最小化我的窗口并调用此代码,则最大化的窗口将恢复为非最小化和非最大化的大小。也许应该有这样的代码:if (minimalized) { ShowWindow(theProcess.MainWindowHandle, 9); } else { SetForegroundWindow(processWindowHandle); }
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多