Outlook Inspector Activate不带前景

时间:2019-02-22 15:52:31

标签: powershell outlook outlook-vba

我有一个PowerShell脚本,可以搜索电子邮件,然后将其打开

一旦有了MailItem对象,我就得到了MailItem.GetInspector的检查员,然后借助Inspector.DisplayInspector.Activate尝试将邮件显示在前台。激活方法的文档说:

  

通过将检查器窗口置于前台来激活它,并   设置键盘焦点。

但是“激活”无效,邮件处于打开状态,但仍处于后台状态,不在前台。而且我也不知道为什么。

我的PowerShell脚本:

param(
[string] $Subject,
[string] $Path
)

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;

Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null
$olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type] 
$outlook = new-object -comobject outlook.application 
$namespace = $outlook.GetNameSpace("MAPI")

$subfolder = $Path.Split('/')

$folder = $namespace.Folders($subfolder[1])

for($i=2; $i -lt $subfolder.Length; $i++) {
    $folder = $folder.Folders($subfolder[$i]) 
}

$filter = "@SQL=urn:schemas:httpmail:subject LIKE '%"+$Subject+"%'"

$mail = $folder.items.find($filter)

$inspector = $mail.GetInspector 
$inspector.Display()
$inspector.Activate()

我只尝试使用$inspector.Display()inspector.Activate(),但是结果是相同的,显示了窗口,但保持在后台。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

Windows不允许后台进程(例如outlook.exe)设置前台窗口-请记住,即使通过您的进程也可能位于前台,该调用也将编组到outlook.exe地址空间中。轮流执行它。

要解决此问题,您需要使用AttachThreadInput()Windows API函数将当前的前台窗口附加到您的线程上,但是不能从PS调用它。

如果可以选择使用Redemption(我是它的作者),则它公开SafeInspectorActive方法,无论Outlook或您的进程是否在后台,该方法都可以使用。在VBS中:

  Set sInspector = CreateObject("Redemption.SafeInspector")
  sInspector.Item = inspector
  sInspector.Activate

答案 1 :(得分:0)

经过更多的研究和测试,这似乎是非常随机的,有时邮件在前台,有时仍在后台,但是当Outlook(软件)打开时,它总是在前台打开,但是我没有找到始终在前台打开它的方法