我有一个PowerShell脚本,可以搜索电子邮件,然后将其打开
一旦有了MailItem对象,我就得到了MailItem.GetInspector的检查员,然后借助Inspector.Display和Inspector.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()
,但是结果是相同的,显示了窗口,但保持在后台。
感谢您的帮助!
答案 0 :(得分:0)
Windows不允许后台进程(例如outlook.exe)设置前台窗口-请记住,即使通过您的进程也可能位于前台,该调用也将编组到outlook.exe地址空间中。轮流执行它。
要解决此问题,您需要使用AttachThreadInput()Windows API函数将当前的前台窗口附加到您的线程上,但是不能从PS调用它。
如果可以选择使用Redemption(我是它的作者),则它公开SafeInspector。Active
方法,无论Outlook或您的进程是否在后台,该方法都可以使用。在VBS中:
Set sInspector = CreateObject("Redemption.SafeInspector")
sInspector.Item = inspector
sInspector.Activate
答案 1 :(得分:0)
经过更多的研究和测试,这似乎是非常随机的,有时邮件在前台,有时仍在后台,但是当Outlook(软件)打开时,它总是在前台打开,但是我没有找到始终在前台打开它的方法