测试Outlook是在后台运行还是可见

时间:2017-01-31 21:23:36

标签: powershell outlook

如果程序没有运行,我发现很多很棒的脚本可以打开程序,但事实证明Outlook很棘手。在Windows 10(build 170121)中,它在登录时打开并在后台运行,因此Get-Process将始终找到至少一个实例,无论应用程序是否从用户角度打开(打开第二个进程)。我没有受过教育的猜测是,它始终存在,因为我将Outlook设置为Win 10设置中的默认邮件程序。

我可以看到后台进程的独特属性,例如PID较低且用户对象的数量= 1,但必须有一种方法可以明确地测试用户界面是否打开(我打电话给你的是什么)第二个过程,并希望测试)

这是一个适用于并非始终在后台运行的程序的脚本。有人会非常友好地指导我对UI流程进行明确的测试吗?非常感谢提前!

if((Get-Process -Name OUTLOOK -ErrorAction SilentlyContinue) -eq $null){
    ."C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE"
}

3 个答案:

答案 0 :(得分:0)

听起来好像你已经在中途使用了get-process部分。如果流程没有运行,您可以启动一个新流程。

从那里你应该只需要最大化并设置前景窗口,这个主题可能有助于

Maximize window and bring it in front with powershell

答案 1 :(得分:0)

也许这段代码可以提供帮助:

Add-Type -AssemblyName Microsoft.Office.Interop.Outlook
$Outlook = New-Object -ComObject Outlook.Application
if($Outlook.ActiveWindow()) { "visible" } else { "hidden" }

它可以解决这个问题,但是我的W10系统没有在后台运行Outlook。

修改

try {
    [Runtime.Interopservices.Marshal]::GetActiveObject('Outlook.Application').ActiveWindow() | Out-Null
    "visible"
} catch {
    "hidden"
}

答案 2 :(得分:0)

系统中只能同时运行一个Outlook实例。 Outlook是一个单身人士。

最简单的解决方案是尝试使用GetActiveObject方法获取Outlook应用程序实例,请参阅Obtain and Log On to an Instance of Outlook获取示例代码。然后,您可以查看Application类的ActiveWindow方法,该方法返回表示桌面上当前Microsoft Outlook窗口的对象,Explorer或Inspector对象。

但是,如果您的应用程序和Office主机在不同的安全上下文中运行,有时您将无法连接到Outlook实例。您需要运行具有相同安全级别的两个应用程序(例如,以管理员身份运行)。

最后一种方法是使用FindWindow函数检索顶级窗口的句柄,该窗口的类名和窗口名与指定的字符串匹配。