Einzelnen Beitrag anzeigen

Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: ClassName von Edit

  Alt 3. Mär 2021, 17:38
Zitat:
Ist das eine .NET-Exe? Die Klassennamen lassen zumindest darauf schließen. Ich bin da kein Experte, aber bist Du sicher, dass sich das Ding einfach so fernsteuern lässt?
Mit diesem Code funktioniert das wunderbar:

Delphi-Quellcode:
procedure TTMSForm2.AdvGlowButton1Click(Sender: TObject);
var
  wnd: HWND;
  wnd_edit: HWND;
begin
   wnd := FindWindow('WindowsForms10.Window.8.app.0.141b42a_r6_ad1', 'AndereAppName');
   wnd := FindWindowEx(wnd, 0, 'WindowsForms10.Window.8.app.0.141b42a_r6_ad1', nil);
   wnd := FindWindowEx(wnd, 0, 'WindowsForms10.Window.8.app.0.141b42a_r6_ad1', nil);
   wnd := FindWindowEx(wnd, 0, 'WindowsForms10.Window.8.app.0.141b42a_r6_ad1', 'Absender');

   wnd_edit := FindControlByNumber(wnd, 'WindowsForms10.EDIT.app.0.141b42a_r6_ad1', 1); //HNr
   if wnd_edit<>0 then SendMessage(wnd_edit,WM_SETTEXT,0,Integer(Pchar(Edit_HNr_A.Text)));

   wnd_edit := FindControlByNumber(wnd, 'WindowsForms10.EDIT.app.0.141b42a_r6_ad1', 2); //Land
   if wnd_edit<>0 then SendMessage(wnd_edit,WM_SETTEXT,0,Integer(Pchar(Edit_Land_A.Text)));
Das einzige Problem ist, dass es nur auf der Entwicklungsmaschine läuft, aber auf anderen nicht. Das liegt daran, dass sich der ClassName (WindowsForms10.EDIT.app.0.141b42a_r6_ad1) von Maschine zu Maschine ändern kann.

Deshalb bin ich jetzt auf der Suche, den ClassName zu identifizieren und als Variable zu verwenden.

Das kann ich erreichen, wenn ich folgenden Code ausführe:
Delphi-Quellcode:
var
  fwnd: THandle;
  wnd: HWND;
  wnd_edit: HWND;
  CName: array [0..255] of Char;
begin
   fwnd := FindWindow(nil, 'AndereAppName');
   GetClassName(fWND, CName, 256);

   wnd := FindWindowEx(fwnd, 0, CName, nil);
   wnd := FindWindowEx(wnd, 0, CName, nil);
   wnd := FindWindowEx(wnd, 0, CName, 'Empfänger');
Aber die Schwierigkeit besteht darin, dass sich der ClassName nach dem Element "Empfänger" ändert. Dann wird aus
WindowsForms10.Window.8.app.0.141b42a_r6_ad1 für die App
ein WindowsForms10.EDIT.app.0.141b42a_r6_ad1 für ein Edit-Feld oder
ein WindowsForms10.BUTTON.app.0.141b42a_r6_ad1 für ein Button.

Und damit verstehe ich nicht umzugehen. Ich kann die Edits nur über die Reihenfolge ermitteln, da sie kein Caption haben...

Delphi-Quellcode:
function TTMSForm2.FindControlByNumber(hApp: HWND; ClassName: string; ControlNr: Word = 1): HWND;
var
  i: Word;
  hControl: HWND;
begin
  Result := 0;
  if IsWindow(hApp) then
  begin
    Dec(ControlNr);
    hControl := 0;
    for i := 0 to ControlNr do
    begin
      hControl := FindWindowEx(hApp, hControl, PChar(ClassName), nil);
      if hControl = 0 then
        Exit;
    end;
  end;
  Result := hControl;
end;
Aber den ClassName bekomme ich irgendwie nicht zusammengebaut. Entweder händisch zusammenfrickeln, was ich nicht gerne möchte, oder ich brauche eine Möglichkeit, eine Function wie FindControlByNumber ohne den ClassName zu bauen.

Macht das mein Problem verständlich?

Gruß
Patrick
Patrick
  Mit Zitat antworten Zitat