Fremde Programme ändern

Hallo!

Ich möchte aus meinem Delphi-Programm heraus den Inhalt eines Textfeldes in einem fremden Programm auslesen und ändern!

Zum Auslesen mache ich im Moment folgendes:

procedure TForm1.Button1Click(Sender: TObject);
const
 MAXTEXT = 10000;
var
 WMGetText: TWMGetText;
 hwndChild: HWND;
 P: array[0..MAXTEXT] of char;
begin
 hwndChild := GetWindow(FindWindow('Notepad',nil),GW\_CHILD);
 if hwndChild = 0 then;
 with WMGetText do
 begin
 Msg := WM\_GETTEXT;
 TextMax := MAXTEXT;
 Text := P;
 end;
 with TMessage(WMGetText) do
 SendMessage(hwndChild,Msg,WParam,LParam);
 memo1.text:=StrPas(P);
end;

Wobei dies mit „Notepad“ noch äusserst einfach ist und auch funktioniert!

Zum einfügen von Text nutze ich folgendes:

procedure TForm1.Button2Click(Sender: TObject);
var
 wnd : HWND;
 i : Integer;
 s : string;
begin
 wnd := FindWindow('notepad',nil);
 if wnd 0 then begin
 wnd := FindWindowEx(wnd,0,'Edit',nil);
 s := 'ABC';
 For i := 1 to Length(s) do
 SendMessage(wnd, WM\_CHAR, Word(s[i]), 0);
 end;
end;

Das klappt auch wunderbar mit Notepad!
Nun ist Notepad aber das einfachste Programm, was man sich vorstellen kann…
Ich würde das aber sehr gerne mit Outlook einmal machen!
Die Bezeichnung des Textfeldes einer Mail hole ich mir folgendermaßen:

procedure TForm1.Button3Click(Sender: TObject);
begin
 MouseCapture := True;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
 pt: TPoint;
 hw: HWND;
 s: String;
 buf: array [0..255] of Char;
 r: TRect;
 intExitCode: integer;
 i : Integer;
 s1 : string;
 text: pchar;
begin
 MouseCapture := False;
 GetCursorPos( pt );
 hw := WindowFromPoint(pt);
 If hw = 0 Then
 Beep
 Else Begin
 GetClassname( hw, buf, 255 );
 S:= StrPas(buf)+#13#10;
 GetWindowRect( hw, r );
 S := S + FOrmat('(%d,%d, %d, %d)',[r.left, r.top, r.right,
r.bottom])+#13#10;
 SendMessage(hw, WM\_GETTEXT, 255, longint(@buf));
 S := s + StrPas(buf);
 SetForegroundWindow( handle );
 memo2.Text:=S;
 end;
end;

Mit den gewonnenen Informationen weiss ich aber leider nicht viel anzufangen! Wie kann ich nun aus eben diesem Textfeld, was ich mit der Maus ausspioniert habe den Text auslesen und ändern?

Danke!

Florian

Hallo Florian,
alle Achtung, an so manche der von Dir benutzen Windows-API’s geht nicht gleich jeder (an Komfort gewohnte) Delphianer heran.

Wenn Du wirklich Outlook (nicht Outlook Express) steuern willst empfehle ich jedoch das COM/OLE/ActiveX-Interface (…wie auch immer der Marketingname von MS heute heißt). Hiermit stehen Dir alle Möglichkeiten offen (Empfangen/Lesen, Anhängen, Senden …). Der Programmieraufwand ist eher minimal, die Systemperformance teilweise aber auch (aber wen kümmert das heute noch?).
„FindWindow“ und Konsorten nutze ich nur im Ausnahmefall, wenn kein anderes Interface (OLE, DDE, Commandline, Textfile…) vorhanden ist. Denn diese Ausnahmefälle sind sehr arbeitsintensiv. Jedes neue Release und jede Sprachversion führt meist zu Variationen, die im eigenen Programm abgefangen werden müssen. Das ist bei OLE in der Regel nicht notwendig.

Einen guten Einstieg in das Thema bieten die DelphiX-Kochbücher vom Hanser-Verlag. Ab Delphi Enterprise sind sogar entsprechende OLE-Server-Komponenten enthalten, es geht aber auch ohne. Tiefergehendes liefert auch Google mit den Suchbegriffen „Outlook“ und „MailItem“ !

Gruß Uwe