(Co-Admin)
Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
Delphi 11 Alexandria
|
Re: Fremde Anwendung ansteuern
2. Aug 2003, 16:14
Moin Paul jr.,
vielleicht kommst Du ja mit diesem Beispiel weiter.
Dieses Beispiel setzt voraus, dass der anzuklickende Button die Klasse BUTTON hat, und nicht beispielsweise TButton oder vielleicht noch ganz anders. Ausserdem gehe ich hier davon aus, dass das Hauptfenster auf jeden Fall gefunden werden kann, da ich keine Absicherung treffe, für den Fall, dass das Fenster nicht da ist (dann läuft die Routine in eine Endlosschleife!)
Das Beispiel ist ungetestet, sollte aber funktionieren.
Delphi-Quellcode:
// Für den Aufbau dieser Funktion siehe EnumChildProc im PSDK
// Der 1. Parameter ist das Handle des gerade gefundenen Child Window
// Der 2. Parameter kann beliebig verwendet werden.
// Ich übergebe hier die Adresse einer Variablen vom Typ DWORD, in der dann,
// wenn der Button gefunden wurde, dessen aktuelles Handle zurückgegeben wird
function FindButton( const AhWindow : DWORD; const ApButton : PDWORD) : longbool; stdcall;
var
pCaption : PChar;
dwLen : DWORD;
begin
// True => Nächstes Child verarbeiten, soweit noch vorhanden
Result := true;
// Prüfen, ob das gefundenen Childwindow ein BUTTON ist
pCaption := AllocMem(255);
try
// Klassenname konnte nicht ausgelesen werden, dann fertig
if GetClassName(AhWindow,pCaption,255) = 0 then exit;
// Ist kein Button, dann fertig
if trim(UpperCase(pCaption)) <> ' BUTTON' then exit;
finally
FreeMem(pCaption,255);
end;
// Captionlänge auslesen, und entsprechend Speicher reservieren
// (+1 wg. der terminierenden Null, da WM_GETTEXTLENGTH die Länge
// ohne diese zurückgibt)
dwLen := SendMessage(AhWindow,WM_GETTEXTLENGTH,0,0);
pCaption := AllocMem(dwLen+1);
try
// Caption auslesen
SendMessage(AhWindow,WM_GETTEXT,dwLen,lParam(pCaption));
// ist es nicht die gesuchte Caption dann fertig
if AnsiUpperCase(trim(pCaption)) <> ' BUTTON CAPTION' then exit;
// False => Nicht weitersuchen, da Button gefunden
Result := false;
// Das Handle des Button zurückgeben
ApButton^ := AhWindow;
finally
FreeMem(pCaption,dwLen+1);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hWindow : DWORD;
hButton : DWORD;
begin
// Programm starten
ShellExecute(0,' open',' Pfad der Exedatei', nil, nil,SW_NORMAL);
// und auf das Handle des Fensters warten
hWindow := 0;
while hWindow = 0 do hWindow := FindWindow( nil,' Titel des zu suchenden Fensters');
// Die Child Windows durchgehen
hButton := 0;
EnumChildWindows(hWindow,@FindButton,integer(@hButton));
// Wenn hButton <> 0 ist, wurde der Button gefunden
if hButton = 0 then exit;
// und kann angeklickt werden
SendMessage(hButton,BM_CLICK,0,0);
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
|