2009-05-06 16 views

答えて

3

選択した電子メールのリストを取得するには、この手順を使用することができます。見通しについては、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; 
-2

Windowsのすべての(ほぼ)コントロールはウィンドウそのものです。そのクラスとインスタンス名を持っています。各メールクライアントの各MailToウィンドウの構成は同じであるため、適切な制御を見つける方法を知った後、解決策を構築することができます。
これは、Visual StudioのSpy ++が便利な場所です(もしあなたがそれを持っていないのであれば、類似のツールを見つけようとするとhttp://msdn.microsoft.com/pl-pl/magazine/cc163617(en-us).aspxにフリーウェアバージョンがありますがクールな検索ツールはありません)。
Spy ++とメールプログラムを起動した後、「New mail」を押すとメーリングウィンドウが表示されます。 Spy ++でリフレッシュし、 "Find window"ツールを使用する - あなたのTOリストをクリックすると、その作成方法が表示されます。
私はOutlook Expressを使い始めました。メールウィンドウはATH_Noteクラスであり、内部アドレスエリアはOE_Envelopeクラスのウィンドウであり、このウィンドウ内にはいくつかのウィンドウがあり、そのうちいくつかはRichEdit20Wクラスです。 "To"フィールドが最初のフィールドです。

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:='[email protected]'; 
    {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; 


注:FindWindowEx二paramは0が常に行の最初に検索されますです - ので、しかし、あなたはこのようにかなったことを行います場合:

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:='[email protected]';<br> 
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br> 

テキストSECOND編集フィールドに配置されます。 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:='[email protected]';<br> 
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br> 



おそらくあなたは、現在のテキストを抽出し、それに応じて新しいテキストを更新するために、WM_GETTEXTを使用したいと思うでしょうが、これは編集フィールドに入るの範囲を超えています。
BTW:このコードはOutlookのバージョンに強く依存しますので、以前はSpy ++でバージョンをチェックしてみてください)。

+3

これはひどく畳み込まれており、まったく必要ありません。 MAPIを使用するか、Outlookを自動化して電子メールを作成できます。原油ハックに頼るのではなく、承認された、文書化された方法でそれを行う方が良いです。 Vista上で管理者以外のユーザーとしてコードを実行しても機能しないときはどうしますか? –

1

smok1:ソリューションが実際に動作しているかどうかを確認しましたか?送信ボタンをクリックしてください。 OEによれば、テキストボックスには入っていますが、アドレスはありません。または、テキストボックスの左側にあるアイコンをクリックします。 OEは、WM_SETTEXTを使用してEntereredアドレスを表示しません。手動で入力する必要があります。

+0

はい、あなたは正しいです。私はWM_CHARを追加することでコードを改善しました。これは実際にコードを動作させ、1つの余分なスペースがOEに入力された電子メールアドレスを見せるようにします。 – smok1

関連する問題