2009-05-06 3 views

답변

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

텍스트를 SECOND 편집 필드에 입력됩니다. FindWindowEx에 대해서는 msdn을 참조하십시오.

이렇게 OE (XP SP3 IE7)에 좋습니다. 그러나 MS 아웃룩은 어떻게 될까? 나는 직장에서 스파이 + + 그것을 확인하고 "To"필드 행 "RichEdit20WPT"클래스 (참고 T는 끝에), 부모 클래스는 "# 32770 (대화)", 부모는 "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을 자동화하여 전자 메일을 만들 수 있습니다. 원한 해킹에 의지하기보다는 승인되고 문서화 된 방법으로 해내는 것이 낫습니다. 비 관리자 사용자로 비스타에서 코드를 실행해도 작동하지 않는 이유는 무엇입니까? –

1

smok1 : 솔루션이 실제로 작동하는지 확인 했습니까? 보내기 버튼을 클릭하십시오. OE에 따르면 텍스트 상자에 있지만 주소는 없습니다. 또는 텍스트 상자의 왼쪽에있는 아이콘을 클릭하십시오. OE는 WM_SETTEXT를 사용하여 enterered 주소를 보지 못합니다. 수동으로 입력해야합니다.

+0

네, 맞습니다. WM_CHAR을 추가하여 코드를 향상 시켰습니다.이 코드는 작업을 수행하며, 하나의 추가 공간은 OE가 입력 한 전자 메일 주소를 보도록 강제합니다. – smok1

관련 문제