1

我在表单上有一个 DBGrid 并且我进行了多项选择,我现在需要将选定的单元格(它们是电子邮件地址)发送到 Outlook 的“TO Box”我该怎么做,我将不胜感激(Delphi5)提前致谢

4

3 回答 3

3

要获取所选电子邮件的列表,您可以使用此过程。对于 Outlook,您可能需要使用 shellexec 和 mailto: 或使用 API(如果有)。

var
i: Integer;
S: TStringList;
begin
S:=TStringList.Create;
if DBGrid1.SelectedRows.Count > 0 then
begin
for i:=0 to DBGrid1.SelectedRows.Count-1 do
begin
Table1.GotoBookmark(pointer(DBGrid1.SelectedRows[i]));
S.Add(Table1EMail.AsString);
end;
//Outlook procedure goes here 
end;

S.Free;
end;
于 2009-05-06T11:30:23.780 回答
1

smok1: have you checked if your solution is actually working? Try to click Send button. OE says there is no address antered although it is in text box. Or click the icon on the left of text box. OE doesn't see address enterered using WM_SETTEXT. You have to manually type it.

于 2009-06-09T20:40:33.907 回答
-2

Windows 中的每个(几乎)控件本身就是一个窗口。它有自己的类名和实例名。由于每个邮件客户端中每个 MailTo 窗口的构造保持不变,因此在了解如何找到合适的控件后,可以构建解决方案。
这就是 Visual Studio 中的 Spy++ 派上用场的地方(如果您没有它,请尝试找到一些类似的工具,在http://msdn.microsoft.com/pl-pl/magazine/cc163617(en ) 上有免费软件版本-us).aspx 但它缺少很酷的搜索工具)。
因此,在启动 Spy++ 和邮件程序后,我们点击“新邮件”,邮件窗口就会出现。在 Spy++ 中刷新,并使用“查找窗口”工具——单击您的 TO 列表,您将看到它是如何构建的。
我从 Outlook Express 开始。邮件窗口是ATH_Note 类的,地址区里面是OE_Envelope 类的窗口,在这个窗口里面有几个窗口,其中一些是RichEdit20W 类的。“收件人”字段是第一个字段。

procedure UpdateToOE;
var
  Window:Thandle;
Text:PChar;
begin
  {Lets find Mail window}
  Window:=FindWindow('ATHNote',nil);
  if (Window = 0) then Exit;
  {Lets find adress area inside}
  Window:= FindWindowEx(Window,0,'OEEnvelope',nil);
  if (Window = 0) then Exit;
  {Lets find TO field - remeber this is the first field of this class}
  Window:= FindWindowEx(Window,0,'RichEdit20W',nil);
  if (Window = 0) then Exit;
  {Prepare text into PChar}
  Text:='test@test.com';
  {Send message WMSETTEXT which will set our text in control}
  SendMessage(Window,WMSETTEXT,0,Integer(Text));

  {Sending one extra space to prevent OE does not notice - answer to grzegorz's question}
  SendMessage(Window,WM_CHAR,32,1);
  //done!
End;


注意:当第二个参数为 0 时,FindWindowEx 将始终在行中搜索 FIRST - 所以,但如果你会这样做:

Window:=FindWindow('ATH_Note',nil);<br>
if (Window = 0) then Exit;<br>
Window:= FindWindowEx(Window,0,'OE_Envelope',nil);<br>
if (Window = 0) then Exit;<br>
Sibling:= FindWindowEx(Window,0,'RichEdit20W',nil);<br>
if (Sibling = 0) then Exit;<br>
Window:=FindWindowEx(Window, Sibling, 'RichEdit20W',nil);<br>
if (Window = 0) then Exit;<br>
Text:='test@test.com';<br>
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br>

文本将被放置在第二个编辑字段中。有关 FindWindowEx,请参见 msdn。

所以,这对 OE (XP SP3 IE7) 是有好处的。但是 MS Outlook 呢?我在工作中使用 Spy++ 进行了检查,“To”字段是连续第二个“RichEdit20WPT”类(最后注意 T),父类是“#32770 (Dialog)”,它的父类是“AfxWndW”和一次再次父类是“AfxWndW”(这是 TPanel 中的某种 MS 风格的 TPanel)和 - tadam!– 邮件窗口属于“rctrl_renwnd32”类。所以这个的伪代码将是:

Window:=FindWindow('rctrl_renwnd32',nil);<br>
Window:= FindWindowEx(Window,0,’AfxWndW’,nil);<br>
Window:= FindWindowEx(Window,0,’AfxWndW’,nil);<br>
Window:= FindWindowEx(Window,0,’#32770 (Dialog)’,nil);<br>
//Search for FIRST (don’t know what it is)<br>
Sibling:= FindWindowEx(Window,0,’RichEdit20WPT’,nil);<br>
//Search for TO field<br>
Window:= FindWindowEx(Window,Sibling,’RichEdit20WPT’,nil);<br>
Text:='test@test.com';<br>
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br>



可能您会想要使用 WM_GETTEXT 来提取当前文本并相应地更新新文本,但这超出了进入编辑字段的范围。
顺便说一句:此代码很大程度上取决于 Outlook 版本,因此请尝试使用 Spy++ 检查您的版本)。

于 2009-05-07T09:46:47.250 回答