Einzelnen Beitrag anzeigen

wadriller

Registriert seit: 25. Feb 2009
43 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Edit einer Fremdanwendung füllen - Es will einfach nicht klappen

  Alt 15. Okt 2013, 13:15
OK.

Ich bin schon ein Stück weiter gekommen. Mittels dem Tool "Winspector" hab ich rausgefunden das die Klasse '#32770' wohl von allem möglichem verwendet wird und da vieles davon wohl auch ein Edit auf sich liegen hat findet man das falsche Handle.

Falls jemand sowas auch mal sucht. Hier meine aktuelle Lösung (aktuell noch mit "grafischer" Ausgabe).

Erstmal sich man sich alle Handle die es zur Klasse '#32770' gibt.
Und danach sucht man auf jedem der Handle nach einem "Indikator" ob man das richtige Fenster hat.
In meinem Fall liegt ein Label mit dem Programmnamen auf der Form

Code:
function EnumChildren(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
  SearchedClass = '#32770';
var
  ClassName: array[0..259] of Char;
begin
  Result := True;
  GetClassName(hwnd, ClassName, Length(ClassName));
  if ClassName = SearchedClass then
    TStrings(lParam).Add(IntTostr(hwnd));
end;

procedure Button2Click(Sender: TObject);
var
  Hauptwnd, Childwnd, EditWnD: HWND;
  i: Integer;
begin
  Hauptwnd:=0;
  Childwnd:=0;
  EditWND := 0;

  Memo1.Clear;
  Memo2.Clear;
// Erst suchen wir alle Handle die es gibt
  EnumChildWindows(Childwnd, @EnumChildren, UINT_PTR(Memo1.Lines));

// Jetzt schauen wir auf welchem das Label liegt woran man festmachen kann das es das richtige Fenster ist
  for I := 0 to Memo1.Lines.Count -1 do begin
    Childwnd := FindWindowEx(strtoint(Memo1.Lines[i]),0,'Static','Inhalt des Labels');
    if Childwnd <> 0 then begin
      Memo2.Lines.Add(Memo1.Lines[i]);
      Childwnd := 0;
      break;
    end;
  end;

// Wenn wir jetzt ein Fenster gefunden haben, suchen wir auf dem Fenster nach dem Edit
  if memo2.Lines.Count > 0 then begin
    EditWnd := FindWindowEx(strtoint(Memo2.Lines[0]),0,'Edit',0);
  end;

// Wenn wir was gefunden haben schreiben wir den Text rein
  if Editwnd <> 0 then
  begin
    SendMessage(Editwnd,WM_Settext,0,integer(pchar('12')));
  end;
end;
Gruß
Michael
  Mit Zitat antworten Zitat