【问题标题】:JclMapi - e-mail message window goes underneath the main formJclMapi - 电子邮件消息窗口位于主窗体下方
【发布时间】:2015-01-28 11:20:36
【问题描述】:

我在使用 JclMAPI 时遇到了一些问题。目前我正在使用带有 Delphi XE3 的 JCL 2.6 Build 5178。

我的应用程序的主要形式是处理不同 MDIChild 表单的 MDIForm。从其中一个中,我可以显示一个模态表单,并从中调用JclSimpleBringUpSendMailDialog,并为ParentWND 参数分配模态表单句柄。

通常,此方法会在模态表单前面打开电子邮件消息窗口。
我的问题是,有时电子邮件消息窗口位于应用程序 mainForm 下方,而我无法再将其置于最前面。

所以应用程序等待 Jcl 方法的返回值,我无法重新激活它。真正的问题是电子邮件窗口位于我的应用程序后面,我无法撰写邮件。
我在互联网上搜索没有运气。

你有没有遇到过这个问题?

【问题讨论】:

    标签: delphi mapi


    【解决方案1】:

    您可能希望切换到使用 Outlook 对象模型而不是简单 MAPI。这样,您可以在显示消息之前先将 Outlook 的主窗口置于前台。 Outlook 的 HWND 可以通过将 Explorer 对象(返回购买 Application.ActiveExplorer)转换为 IOleWindow 并调用 IOleWindow.GetWindow 来检索。拥有 HWND 后,您可以使用以下方式将其置于前台:

    function ForceForegroundWindow(hWnd: THandle): BOOL;
    var
      hCurWnd: THandle;
    begin
      hCurWnd := GetForegroundWindow;
      AttachThreadInput(
        GetWindowThreadProcessId(hCurWnd, nil),
        GetCurrentThreadId, True);
      Result := SetForegroundWindow(hWnd);
      AttachThreadInput(
        GetWindowThreadProcessId(hCurWnd, nil),
        GetCurrentThreadId, False);
    end;
    

    【讨论】:

    • 我需要使用 JclMAPI 对象,因为我必须同时支持 Outlook 而不是 Thunderbird。
    • 您仍然可以检查 Outlook 是否已安装并将其置于前台。单独使用 Simple MAPI 无法满足您的需求。
    • 在大多数情况下,JclMapi 函数“正常工作”:新的电子邮件消息窗口正确显示在我的应用程序前面(即使 Outlook 或 Thunderbird 已关闭)但有时它没有不。我无法准确说出导致问题的正确条件是什么,因为我无法在我的开发环境中复制该问题。使用 Outlook 对象模型意味着更改我的应用程序的邮件系统的很大一部分,我现在不能采用这个解决方案,但我会试一试。如果没有其他解决方案,我将使用 Outlook 对象模型。
    • 我认为您错过了我的观点 - 您可以使用 OOM 检查 Outlook 是否已在运行,然后在调用您的 Simple MAPI 代码之前将其置于前台。
    • 谢谢迪米特里!在测试您的解决方案后,我现在可以检索 Outlook 主窗口句柄,将其强制到前台并将消息窗口直接链接到它。
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多