フォームに DBGrid があり、複数の選択を行いました。選択したセル (電子メール アドレス) を Outlook の「TO ボックス」に送信する必要があります。これを行うにはどうすればよいですか?前もって感謝します
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;
smok1:ソリューションが実際に機能しているかどうかを確認しましたか?[送信]ボタンをクリックしてみてください。OEは、テキストボックス内にあるのに、アドレスが変更されていないと言います。または、テキストボックスの左側にあるアイコンをクリックします。OEは、WM_SETTEXTを使用して入力されたアドレスを認識しません。手動で入力する必要があります。
Windowsのすべての(ほとんど)コントロールはウィンドウ自体です。クラスとインスタンス名があります。各メールクライアントのすべてのMailToウィンドウの構造は同じままであるため、適切な制御を見つける方法を理解した後、ソリューションを構築できます。
ここで、VisualStudioのSpy++が役立ちます(お持ちでない場合は、同様のツールを探してみてください。http://msdn.microsoft.com/pl-pl/magazine/cc163617 (en)にフリーウェアバージョンがあります。 -us).aspx ですが、クールな検索ツールがありません)。
そこで、Spy ++とメールプログラムを起動した後、「新着メール」を押すとメールウィンドウが表示されます。Spy ++で更新し、「ウィンドウの検索」ツールを使用します– TOリストをクリックすると、その構築方法がわかります。
OutlookExpressから始めました。メールウィンドウはクラス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;
注:2番目のパラメーターが0の場合のFindWindowExは、常に行のFIRSTを検索します。ただし、次のようにsthを実行する場合は次のようになります。
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>
テキストは2番目の編集フィールドに配置されます。FindWindowExについてはmsdnを参照してください。
したがって、これはOE(XP SP3 IE7)に適しています。しかし、MS Outlookはどうでしょうか?作業中のSpy++で確認したところ、「To」フィールドは2番目の行の「RichEdit20WPT」クラス(最後のTに注意)、親クラスは「#32770(Dialog)」、この親は「AfxWndW」で、1回ここでも、親クラスは「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++でバージョンを確認してみてください)。