【发布时间】:2017-12-16 05:41:49
【问题描述】:
如果MainWindowHandle 不为0,则以下代码将窗口置于前台。
如何将MainWindowHandle = 0 的窗口置于最前面?
这适用于 Microsoft Excel - 兼容性检查器窗口,该窗口显示一个 GUI,但在任务栏中没有图标,并且 MainWindowHandle = 0。
我没有运行其他 Excel 实例。
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@
$excel = (Get-Process | Where-Object { $_.ProcessName -eq 'EXCEL' }).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($excel)
在 Windows 任务管理器中,我可以右键单击“Microsoft Excel - 兼容性检查器”并单击“置于前面”,这样就可以了。如何在 Powershell 中模拟此功能?
【问题讨论】:
-
每个窗口都有一个窗口句柄,不管它是否有任务栏按钮。您需要找到正确的窗口句柄。
-
我的代码没有得到正确的 MainWindowHandle 吗?如果 MainWindowHandle 不正确,我该如何获取它?
-
MainWindowHandle是一个谎言。 Windows API 不模拟主窗口 的概念。这纯粹是在 .NET 框架中实现的,它应用启发式方法来确定用户将什么视为主窗口。这不能保证成功。您需要使用不同的方法来找到您感兴趣的窗口句柄(例如EnumWindows)。
标签: excel powershell winapi user32