【发布时间】:2009-05-06 10:07:33
【问题描述】:
我在表单上有一个 DBGrid,并且我进行了多项选择,我现在需要将选定的单元格(它们是电子邮件地址)发送到 Outlook 的“TO Box”我该怎么做,我将不胜感激(德尔福5) 提前致谢
【问题讨论】:
我在表单上有一个 DBGrid,并且我进行了多项选择,我现在需要将选定的单元格(它们是电子邮件地址)发送到 Outlook 的“TO Box”我该怎么做,我将不胜感激(德尔福5) 提前致谢
【问题讨论】:
要获取所选电子邮件的列表,您可以使用此过程。对于 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;
【讨论】:
smok1:你检查过你的解决方案是否真的有效吗?尝试单击发送按钮。 OE 说没有地址,虽然它在文本框中。或单击文本框左侧的图标。 OE 看不到使用 WM_SETTEXT 输入的地址。您必须手动输入。
【讨论】:
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++ 检查您的版本。
【讨论】: