我目前在XP上使用Delphi 7,但我想最终将代码迁移到Win8上的DXE。
我正在尝试使用JCL发送电子邮件,使用JCLMAPI是特定的。我尝试使用JCLMAPI单元中的JclSimpleSendMail
例程。这是电话的接口。
function JclSimpleSendMail(const Recipient, Name, Subject, Body: AnsiString; const Attachment: TFileName; ShowDialog: Boolean; ParentWND: THandle; const ProfileName: AnsiString; const Password: AnsiString): Boolean;
问题是它以模态方式弹出默认的MAPI客户端消息框(在我的案例中是Outlook 2010)。我希望它只是打开电子邮件消息窗口,但允许用户继续在Delphi应用程序中工作。直到他们准备好发送,例如,如果用户想要在发送电子邮件之前继续在Delphi应用程序中工作。这可能吗?
我注意到TJCLEmail中有一个ParentHWND属性,我尝试将其设置为零(我知道这是一个范围),但我希望删除父句柄可能会改变模态行为(没有运气!)
function TForm1.SimpleSendHelper2(const ARecipient, AName, ASubject, ABody: AnsiString; const AAttachment: TFileName;
AShowDialog: Boolean; AParentWND: THandle; const AProfileName, APassword, AAddressType: AnsiString): Boolean;
var
AJclEmail: TJclEmail;
begin
AJclEmail := TJclEmail.Create;
try
**AJCLEmail.ParentWnd := 0; //TRIED FORCING THE ATTACHED HANDLE TO ZERO**
*//if AParentWND <> 0 then
// AJclEmail.ParentWnd := AParentWND;*
if ARecipient <> '' then
AJclEmail.Recipients.Add(ARecipient, AName, rkTO, AAddressType);
AJclEmail.Subject := ASubject;
AJclEmail.Body := ABody;
if AAttachment <> '' then
AJclEmail.Attachments.Add(AnsiString(AAttachment));
if AProfileName <> '' then
AJclEmail.LogOn(AProfileName, APassword);
Result := AJclEmail.Send(AShowDialog);
finally
AJclEmail.Free;
end;
end;
这也成功打开了默认MAPI应用程序并填写了所有传递的信息(TO,Subject,Body,Attachment)。不幸的是,它仍然以模态方式打开消息框。
最后,我还尝试了http://www.delphifaq.com/faq/delphi/network/f236.shtml处的代码。此代码只是直接使用MAPI(没有JCL)。不幸的是,它还会以模态方式弹出消息框。
关于如何以非模态方式打开默认MAPI客户端的任何想法?
谢谢!
答案 0 :(得分:3)
您可以使用分配了MAPI_DIALOG_MODELESS标志的Windows API函数MAPISendMailW。 但是,您必须为Win8及更高版本使用MAPISendMailHelper函数,对Windows 7及更早版本使用MAPISendMailW。对于Windows 7,此类功能仅适用于某些(最新)版本的Office,并且仅安装了W indows SDK for Windows 8(根据MSDN)。如果使用了另一个电子邮件客户端(不是MS Outlook),则无法保证其正常运行。
换句话说,它是可能的,但它很棘手。我建议你把它保存在模态形式中,由于很多原因它更安全。如果用户“还没准备好发送电子邮件”,那么他就不会激活这样的功能(或取消它以返回程序)。