Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Fremde Anwendung ansteuern

  Alt 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)) <> 'BUTTONthen 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 CAPTIONthen 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
  Mit Zitat antworten Zitat