1

フォームに DBGrid があり、複数の選択を行いました。選択したセル (電子メール アドレス) を Outlook の「TO ボックス」に送信する必要があります。これを行うにはどうすればよいですか?前もって感謝します

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:ソリューションが実際に機能しているかどうかを確認しましたか?[送信]ボタンをクリックしてみてください。OEは、テキストボックス内にあるのに、アドレスが変更されていないと言います。または、テキストボックスの左側にあるアイコンをクリックします。OEは、WM_SETTEXTを使用して入力されたアドレスを認識しません。手動で入力する必要があります。

于 2009-06-09T20:40:33.907 に答える
-2

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++でバージョンを確認してみてください)。

于 2009-05-07T09:46:47.250 に答える