AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ClassName von Edit

Ein Thema von Ykcim · begonnen am 3. Mär 2021 · letzter Beitrag vom 5. Mär 2021
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#1

AW: ClassName von Edit

  Alt 3. Mär 2021, 12:07
Am Ende ist das mein Problem: Der ClassName ändert sich...

Ich hatte folgendes probiert, aber damit komme ich nicht weiter:

Delphi-Quellcode:
   fwnd := FindWindow(nil, 'WmD_VersandLabel');
   GetClassName(fWND, CName, 256);

   wnd := FindWindowEx(wnd, 0, CName, nil);
   wnd := FindWindowEx(wnd, 0, CName, nil);
   wnd := FindWindowEx(wnd, 0, CName, nil);
   wnd := FindWindowEx(wnd, 0, CName, 'Empfänger');

   for I := 0 to 50 do begin
      wnd_edit:= GetDlgItem(wnd, I);
   end;
Ich wollte einfach mal sehen, welche ID's er findet - leider immer 0.

Ich habe mal den Tree in den Anhang gestellt, vielleicht gibt das ja Aufschluss...

An die Edits von Empfänger möchte ich ran...

Vielen Dank
Patrick
Angehängte Grafiken
Dateityp: jpg Window_Tree.jpg (107,6 KB, 16x aufgerufen)
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ClassName von Edit

  Alt 3. Mär 2021, 12:30
Delphi-Quellcode:
   fwnd := FindWindow(nil, 'WmD_VersandLabel');
   GetClassName(fWND, CName, 256);

   wnd := FindWindowEx(wnd, 0, CName, nil);
ersetze mal im findwindowex() wnd mit fwnd. Vielleicht hilft es?

Wenn du meinen vorschlag von oben folgst, ist classname oder handle dank GetDlgItem() überflüssig.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 3. Mär 2021 um 12:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: ClassName von Edit

  Alt 3. Mär 2021, 12:42
Ich wollte einfach mal sehen, welche ID's er findet - leider immer 0.
Dir ist schon bewusst das Control-Ids in die Zehntausende gehen können?
Ein 0 bis 50 durchiterieren bringt da nichts.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#4

AW: ClassName von Edit

  Alt 3. Mär 2021, 13:47
Zitat:
Dir ist schon bewusst das Control-Ids in die Zehntausende gehen können?
Ja, aber ich wollte wissen, ob er irgendwann etwas anderes als 0 zurückliefert...

Ich habe es jetzt so versucht:
Delphi-Quellcode:
 fwnd: THandle;
  wnd: HWND;
  wnd_edit: HWND;
  CName: array [0..255] of Char;
  I: integer;
begin
   fwnd := FindWindow(nil, 'WmD_VersandLabel');
   GetClassName(fWND, CName, 256);

   wnd := FindWindowEx(fwnd, 0, CName, nil);
   wnd := FindWindowEx(wnd, 0, CName, nil);
   wnd := FindWindowEx(wnd, 0, CName, 'Empfänger');

   SendMessage(GetDlgItem(fwnd, 5), WM_SETTEXT, 0, Integer(PChar(Edit_Strasse_E.Text)));
wnd hat dann des Wert von Empfänger (263610)
Dort liegen auf die Felder an die ich möchte. Aber leider ändert sich ja dann der ClassName von WindowsForms10.Window.8.app.0.141b42a_r6_ad1 nach WindowsForms10.EDIT.app.0.141b42a_r6_ad1

Ich habe mal geguckt, was er mit GetDlgItem(fwnd, 5) zurückliefert - leider immer nur eine 0.

Irgendwie habe ich es noch nicht geblickt...
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#5

AW: ClassName von Edit

  Alt 3. Mär 2021, 14:58
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#6

AW: ClassName von Edit

  Alt 3. Mär 2021, 16: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.348 Beiträge
 
Delphi 12 Athens
 
#7

AW: ClassName von Edit

  Alt 3. Mär 2021, 16:49
Diese ID scheint ja bei allen Controls gleich zu sein.
Dann brauchst doch nur einmal nach irgendeinem Control zu suchen, also mit FindWindowEx ohne ClassName über alle Controls einer Form laufen und über GetClassName den Namen auslesen, bis was Passendes gefunden wurde.
Da dann die ID extrahieren und, für alle deine weiteren Zugriffe, an deine ClassName's anhängen.


Und ja, das sind die generierten Namen der .NET Winforms (C# oder VB.NET)
Bei Google suchenWindowsForms10 classname bzw. Bei Google suchenWindowsForms10 classname ... viel Spaß

Es gibt aber auch genügend Test-Frameworks, welche damit zurecht kommen und die man bestimmt auch zum Steuern nutzen könnte.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Mär 2021 um 21:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: ClassName von Edit

  Alt 3. Mär 2021, 18:46
Ist das Ziel Programm öffentlich?
Wenn ja, teil doch mal Link dahin.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz