c#将outlook窗口带到前面
我还没有找到解决这个问题的可行办法 我有一个启动outlook compose窗口的外部应用程序,我想确保它总是在前面弹出。并非总是如此。例如,如果我用tab键切换到Outlook,然后返回应用程序并启动任务,它只会在底部闪烁 我尝试了一些关于getinspector.Active()等的建议,但没有任何效果 一些示例代码:c#将outlook窗口带到前面,c#,outlook,C#,Outlook,我还没有找到解决这个问题的可行办法 我有一个启动outlook compose窗口的外部应用程序,我想确保它总是在前面弹出。并非总是如此。例如,如果我用tab键切换到Outlook,然后返回应用程序并启动任务,它只会在底部闪烁 我尝试了一些关于getinspector.Active()等的建议,但没有任何效果 一些示例代码: String address = "someone@example.com"; Outlook.Application oApp = new Outlook.Applic
String address = "someone@example.com";
Outlook.Application oApp = new Outlook.Application();
Outlook._MailItem oMailItem = (Outlook._MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem);
oMailItem.To = address
oMailItem.Body = "example";
oMailItem.Display(true); //true = modal which I need for this task, have tried without also.
一般来说,这是无法做到的。考虑了如果两个应用程序都希望同时成为最高级别的应用程序,会发生什么情况
有关更广泛的讨论,请参阅。我没有安装outlook,但是如果将outlook窗口最小化,您可以将整个outlook窗口置于最前面:
[DllImport("user32.dll")]
private static extern int SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_SHOWNORMAL = 1;
private const int SW_RESTORE = 9;
Process proc = Process.GetProcessesByName("spotify").FirstOrDefault();
if (proc != null)
{
ShowWindow(proc.MainWindowHandle, SW_SHOWNORMAL); // Make the window visible if it was hidden
ShowWindow(proc.MainWindowHandle, SW_RESTORE); // Next, restore it if it was minimized
SetForegroundWindow(proc.MainWindowHandle); // Finally, activate the window
}
SetForegroundWindow:
展示窗口:
从中翻译示例函数是否有特殊问题 如果无法使
IOleWindows
/AttachThreadInput
/setForeGroundIndow
工作,则可以使用及其/激活
方法。以下VB脚本将把Outlook主窗口带到前台:
set App = CreateObject("Outlook.Application")
set sExplorer = CreateObject("Redemption.SafeExplorer")
sExplorer.Item = App.ActiveExplorer
sExplorer.Activate
这是您需要的工作代码。将窗口带到前台缺少的成分实际上是“inspector.Activate()”,您必须在“mailItem.Display”之后调用它
只是想解释一下诺纳斯的答案。这对我有用。在调用电子邮件显示功能之前,首先最大化outlook窗口
[DllImport("user32.dll")]
private static extern int SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_SHOWMAXIMIZE = 3;
public void Display()
{
message = RedemptionLoader.new_SafeMailItem();
message.Item = mailApp.CreateItem(Outlook.OlItemType.olMailItem);
Process proc = Process.GetProcessesByName("outlook").FirstOrDefault();
if (proc != null)
{
ShowWindow(proc.MainWindowHandle, SW_SHOWMAXIMIZE);
SetForegroundWindow(proc.MainWindowHandle);
}
((Outlook.MailItem)message.Item).Display(false); // Show email to user, false = Non-Modal
}
在显示消息之前,请尝试将某些内容打印到调试窗口:
Set itm = ol.CreateItem(olMailItem)
Set ins = itm.GetInspector
Debug.Print "this makes the window display..."
ins.Activate
ins.WindowState = olNormalWindow
itm.Display
此解决方案在调用omalitem.Display(true)后立即在前台设置Outlook process Main窗口
不优雅,但它可以工作。我尝试使用Boinst的答案,但它无法在Outlook最小化时将新电子邮件带到前台。这对我来说似乎更为一致:
MailItem mailItem = applicationOutlook.CreateItem(OlItemType.olMailItem);
mailItem.To = strTo;
mailItem.CC = strCC;
mailItem.Subject = strSubject;
mailItem.HTMLBody = strHtmlBody;
Inspector inspector = mailItem.GetInspector;
inspector.Activate();
inspector.WindowState = OlWindowState.olMinimized;
mailItem.Display(false);
inspector.WindowState = OlWindowState.olNormalWindow;
试着更清楚地解释为什么这是问题的答案。
[DllImport("User32.dll", SetLastError = true)]
static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
oMailItem.Display(true);
var outlookProcess = Process.GetProcessesByName("OUTLOOK");
IntPtr handle = outlookProcess[0].MainWindowHandle;
SwitchToThisWindow(handle, true);
MailItem mailItem = applicationOutlook.CreateItem(OlItemType.olMailItem);
mailItem.To = strTo;
mailItem.CC = strCC;
mailItem.Subject = strSubject;
mailItem.HTMLBody = strHtmlBody;
Inspector inspector = mailItem.GetInspector;
inspector.Activate();
inspector.WindowState = OlWindowState.olMinimized;
mailItem.Display(false);
inspector.WindowState = OlWindowState.olNormalWindow;