3

我正在使用带有 Delphi 的 OLE 从我的 delphi 应用程序到 Outlook 进行通信。

我正在使用以下代码在 Outlook 中打开新的电子邮件表单。问题是表单在后台,所以如果我从中生成电子邮件表单的表单被最大化,它将“覆盖”Outlook 新邮件表单。

我怎样才能使该表格出现在顶部?(不是“粘在顶部”,而只是它出现在顶部,然后用户可以根据需要将其最小化)。

这是代码:

try
    OutlookApp := GetActiveOleObject('Outlook.Application');
  except
    OutlookApp := CreateOleObject('Outlook.Application');
  end;
  try
    MailItem := OutlookApp.CreateItem(olMailItem);
    MailItem.To := 'Test@mail.com';     
    MailItem.Subject := 'This is the subject';
    MailItem.HTMLBody    := '<HTML>Test</HTML>';
    MailItem.Display;
  finally
    OutlookApp    := VarNull;
  end;
end;
4

3 回答 3

4

只需再添加一个调用:

MailItem.Display;
OutlookApp.ActiveWindow.Activate;

激活将 Outlook 置于最前面。

于 2013-12-17T14:52:20.717 回答
2

具有应该使您的窗口模式化的MailItem.Display可选参数Modal,因此请尝试使用:

MailItem.Display(True);
于 2012-04-02T08:13:40.133 回答
1

我意识到这是一个老话题,但我最近对使用 Outlook 2016 的用户遇到了同样的问题。对我来说,解决方案需要能够包含签名和附件并在顶部打开新的 Outlook 窗口。如果您调用 MailItem.Display(True),则会丢失附件。这是对我有用的解决方案。

请注意窗口名称中“消息 (HTML)”之后的额外空格。我花了很长时间才发现新 HTML 电子邮件的窗口名称末尾有一个额外的空格。

procedure DisplayMail(Address, Subject, Body: string; Attachment: TFileName);
var
  Outlook: OleVariant;
  Mail: OleVariant;
  H : THandle;                                                              
  TempTitle : String;                                                      
begin
  TempTitle := 'Temp-'+IntToStr(Random(1000000));                         
  try
    Outlook := GetActiveOleObject('Outlook.Application');
  except
    Outlook := CreateOleObject('Outlook.Application');
  end;
  Mail := Outlook.CreateItem(olMailItem);
  Mail.To := Address;
  Mail.Subject := TempTitle;                                             
  Mail.Display(false);
  H := FindWindow('rctrl_renwnd32',PWidechar(TempTitle+' - Message (HTML) '));
  Mail.Subject := Subject;                                               
  if Body <> '' then
    Mail.HTMLBody := InsertMessage(Body,Mail.HTMLBody);
  if Attachment <> '' then                                              
    Mail.Attachments.Add(Attachment);                                  
  try
    if H <> 0 then
      SetForegroundWindow(H);
  finally
  end;
end; 

这对我有用,它允许我添加附件,并保留默认签名。我希望这对某人有所帮助。

于 2018-04-24T16:37:52.853 回答