我想编写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
参数但结果相同。
答案 0 :(得分:2)
之前我已经完成了这项工作,你想获得一个打开的所有内容的列表,最小化所有内容,然后再次迭代它,将每个程序与你想要恢复的程序进行比较,然后恢复那个程序。你需要一种方法来识别你想要恢复的一个窗口,我曾经使用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);
}
}