gpt4 book ai didi

delphi - 在 Outlook 中生成新消息并显示为模式

转载 作者:行者123 更新时间:2023-12-02 04:43:06 26 4
gpt4 key购买 nike

我需要从应用程序使用 Outlook 生成并发送消息。邮件表单应显示为模式,主要是因为我生成附件,并且当用户发送电子邮件(或丢弃它)时应将其删除。

我的问题是当我将 Outlook 对话框设置为模式(“MailIt.Display(True)”)时,Outlook 消息窗口显示在背景中。命令“Outlook.ActiveWindow.Activate”将其置于前面,但当窗口已经可见时可以调用它,因此如果窗口是模态的,我无法调用它。我尝试了这段代码:

MailIt.Display(False);
OleVariant(Outlook.ActiveWindow).Activate;
MailIt.Display(True);

但是 id 不起作用,如果表单已经显示为正常模式,则无法切换到模式。有任何想法吗?我的环境:Windows 8(禁用UAC)、XE3、Outlook 2010。

刚刚尝试按照 Arioch 的建议将我的表单发送到后台:

SetWindowPos(AWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
MailIt.Display(AModal);
SetForegroundWindow(AWnd);

在这种情况下,Outlook 成为前台(因为我需要它),但我的 from 可以变得不可见(如果有其他正在运行的应用程序打开了表单),所以它也不能解决问题。顶部应该是处于模式状态的 Outlook,而我的应用程序位于 Outlook 旁边。

SetWindowPos(AWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE) 

比 HWND_BOTTOM 更好,但不能保证 Outlook 成为前台。

已编辑2。基于事件的最终(希望)解决方案(来自 Kobik 的建议):

uses
Vcl.OleServer, Winapi.ActiveX;

Type
TOutlookMsgForm = class
private
protected
FOutlook: OutlookApplication;
FMessageSent: Boolean;

procedure OnOpen(ASender: TObject; var Cancel: WordBool);
procedure OnSend(ASender: TObject; var Cancel: WordBool);
function TryDisplayOutlookMail(const AMailTo, ASubject, ABody: string;
const AAttachmentFileNames: array of string; AWnd: HWND; AModal: Boolean): boolean;

property Outlook: OutlookApplication read FOutlook write FOutlook;
property MessageSent: Boolean read FMessageSent write FMessageSent;
public
class function DisplayOutlookMail(const AMailTo, ASubject, ABody: string;
const AAttachmentFileNames: array of string; AWnd: HWND; AModal: Boolean = True): boolean; static;
end;

{ TOutlookMsgForm }

procedure TOutlookMsgForm.OnOpen(ASender: TObject; var Cancel: WordBool);
begin
if (Outlook<>nil) and (Outlook.ActiveWindow<>nil) then
OleVariant(Outlook.ActiveWindow).Activate;
end;

procedure TOutlookMsgForm.OnSend(ASender: TObject; var Cancel: WordBool);
begin
Cancel := False;
MessageSent := True;
end;

function TOutlookMsgForm.TryDisplayOutlookMail(const AMailTo, ASubject, ABody: string;
const AAttachmentFileNames: array of string; AWnd: HWND; AModal: Boolean): boolean;
var
MailIt: MailItem;
Mail: TMailItem;
i: Integer;
begin
MessageSent := False;
try
OleInitialize(nil);
try
Outlook := CoOutlookApplication.Create;
Mail := nil;
try
MailIt := Outlook.CreateItem(olMailItem) as MailItem;
MailIt.To_ := AMailTo;
MailIt.Subject := ASubject;
MailIt.Body := ABody;
for i := Low(AAttachmentFileNames) to High(AAttachmentFileNames) do
MailIt.Attachments.Add(AAttachmentFileNames[i], EmptyParam, EmptyParam, EmptyParam);
Mail := TMailItem.Create(nil);
Mail.ConnectTo(MailIt);
Mail.OnOpen := OnOpen;
Mail.OnSend := OnSend;
MailIt.Display(AModal);
if AModal and (AWnd<>0) then
SetForegroundWindow(AWnd);
Result := true;
finally
FreeandNil(Mail);
MailIt := nil;
Outlook := nil;
end;
finally
OleUnInitialize;
end;
except
Result := False;
end;
end;

这样就解决了(尝试#3)。谢谢!

最佳答案

如果您无法将 Outlook 置于前台,也许您可​​以通过从辅助线程发布消息来将自己的应用程序推至后台?

关于delphi - 在 Outlook 中生成新消息并显示为模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20632837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com