2009-05-06 7 views

Répondre

3

Pour obtenir la liste des E-Mails sélectionnés, vous pouvez utiliser cette procédure. Pour Outlook, vous pouvez utiliser shellexec et mailto: ou utiliser l'API s'il y en a.

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

Chaque contrôle (presque) dans Windows est une fenêtre elle-même. Il a son nom de classe et d'instance. Puisque la construction de chaque fenêtre MailTo dans chaque client de messagerie reste la même, après avoir acquis des connaissances pour trouver le contrôle approprié, une solution peut être construite.
C'est là que Spy ++ de Visual Studio est très pratique (si vous ne l'avez pas, essayez de trouver un outil similaire, il existe une version freeware au http://msdn.microsoft.com/pl-pl/magazine/cc163617(en-us).aspx mais il manque d'outil de recherche cool).
Donc, après avoir lancé Spy ++ et le programme de messagerie, nous avons frappé "New mail" et la fenêtre de diffusion apparaîtra. Actualisez dans Spy ++, et utilisez l'outil "Trouver une fenêtre" - cliquez sur votre liste TO, et vous verrez comment elle est construite.
J'ai commencé avec Outlook Express. La fenêtre de courrier est de la classe ATH_Note, alors la zone d'adresse à l'intérieur est une fenêtre de la classe OE_Envelope et dans cette fenêtre il y a plusieurs fenêtres, certaines d'entre elles sont de la classe RichEdit20W. Le champ "À" est le premier.

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; 


Note: FindWindowEx lorsque le deuxième param est 0 sera toujours chercher d'abord dans la ligne -, mais si vous allez faire qqch comme ceci:

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> 

Le texte sera mis dans un deuxième champ d'édition. Voir msdn pour FindWindowEx. Donc, ceci est bon pour l'OE (XP SP3 IE7). Mais avec MS Outlook? Je l'ai vérifié avec Spy ++ au travail et "To" Field est une deuxième classe "RichEdit20WPT" (note T à la fin), la classe parent est "# 32770 (Dialog)", parent de ceci est "AfxWndW" et une fois encore une fois la classe parente est "AfxWndW" (c'est un genre TPanel type MS dans TPanel) et - tadam! - La fenêtre de courrier est d'une classe "rctrl_renwnd32". Ainsi, le pseudo-code pour ce sera:

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> 



probablement vous voudrez utiliser WM_GETTEXT pour extraire le texte actuel et mettre à jour un nouveau texte en conséquence, mais cela dépasse la portée d'obtenir dans le champ d'édition.
BTW: Ce code dépend fortement de la version de Outlook, alors essayez de vérifier votre version avec Spy ++ avant).

+3

Ceci est terriblement compliqué et totalement inutile. Vous pouvez utiliser MAPI ou automatiser Outlook pour créer l'email; il est préférable de le faire d'une manière approuvée et documentée plutôt que de recourir à des hacks bruts. Et que faites-vous lorsque vous exécutez votre code sur Vista en tant qu'utilisateur non administrateur et que cela ne fonctionne pas? –

1

smok1: avez-vous vérifié si votre solution fonctionne réellement? Essayez de cliquer sur le bouton Envoyer. OE dit qu'il n'y a pas d'adresse, même si elle est dans la zone de texte. Ou cliquez sur l'icône à gauche de la zone de texte. OE ne voit pas l'adresse saisie en utilisant WM_SETTEXT. Vous devez le taper manuellement.

+0

Oui, vous avez raison. J'ai amélioré le code en ajoutant WM_CHAR - ceci fait effectivement fonctionner le code, parce qu'un espace supplémentaire force OE à voir l'adresse email entrée. – smok1

Questions connexes