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
Seite 1 von 2  1 2      
Ykcim

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

ClassName von Edit

  Alt 3. Mär 2021, 11:32
Hallo Zusammen,

ich versuche gerade auf ein anderes Programm zuzugreifen und habe da meine Schwierigkeiten...

Delphi-Quellcode:
var
  fwnd: THandle;
  wnd: HWND;
  wnd_edit: HWND;
  CName: array [0..255] of Char;
begin
   fwnd := FindWindow(nil, 'Das andere Programm');
   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'); //Bis hierhin passt es. Der ClassName der App ist 'WindowsForms10.Window.8.app.0.141b42a_r6_ad1'

   wnd_edit := FindControlByNumber(wnd, 'WindowsForms10.EDIT.app.0.141b42a_r6_ad1', 1); //Wenn ich jetzt aber auf das Edit zugreifen möchte, muss ich den ClassName ändern
   if wnd_edit<>0 then SendMessage(wnd_edit,WM_SETTEXT,0,Integer(Pchar(Edit_HausNr.Text))); //Wenn ich das händisch mach geht das.

   //wnd_edit:= FindControlByNumber(FindWindow(CName, nil),'Edit', 1) ///Das klappt nicht, dann wird wnd_edit=0
end;

Das Problem ist, dass ich das Edit mit der ControllNr finde:
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;
Dafür brauche ich den ClassName. Der ändert sich aber:
Von der App : WindowsForms10.Window.8.app.0.141b42a_r6_ad1
Von dem Edit : WindowsForms10.EDIT.app.0.141b42a_r6_ad1

Ich glaube nicht, dass es sinnvoll ist, den ClassName "händisch" zu ändern. Wenn die App auf einem anderen Rechner läuft, wird es nicht mehr klappen.

Kann mir jemand einen Tip geben, wie ich das hinbekomme?

Vielen Dank
Patrick
Patrick

Geändert von Ykcim ( 3. Mär 2021 um 11:40 Uhr)
  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, 11:56
Ändert sich auch die Caption andauernd?
Wenn beides dynamisch ist, würde ich über PID ein Handle ermitteln.

Ist Control-ID auch dynamisch muss man sich durch alle Childs durchiterieren.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Ykcim

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

AW: ClassName von Edit

  Alt 3. Mär 2021, 12:01
Das Problem ist, dass das Edit kein Caption hat...

Was meinst Du mit PID?
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: ClassName von Edit

  Alt 3. Mär 2021, 12:06
Ich meinte Caption vom Ziel-Fenster.
PID = ProcessID
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: ClassName von Edit

  Alt 3. Mär 2021, 12:14
Andersrum, wenn ich was Fernsteuern mag, schau ich mir mit WinSpy ö.ä. erstmal das Ziel an.

Wenn ich darüber eine feste Control-Id bekomme für das Edit ist die halbe Miete schon im Sack.

Dann nurnoch eine Möglichkeit finden mich mit dem Ziel zu verbinden.

Also per FindWindow() ein Handle holen. Vom Fenster, nicht vom Edit!
Wenn das nicht möglich ist halt über die ProcessID.

Dann zum Beispiel sowas machen
Code:
SendMessage(GetDlgItem(dasHandle, dieControlID), WM_SETTEXT, 0, Integer(PChar('neuer Text')));
Um text zu ändern.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 3. Mär 2021 um 12:38 Uhr) Grund: Korrigiert
  Mit Zitat antworten Zitat
Ykcim

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

AW: ClassName von Edit

  Alt 3. Mär 2021, 13: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
Miniaturansicht angehängter Grafiken
window_tree.jpg  
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: ClassName von Edit

  Alt 3. Mär 2021, 13: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 13:32 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, 13: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
824 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: ClassName von Edit

  Alt 3. Mär 2021, 14: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.624 Beiträge
 
Delphi 12 Athens
 
#10

AW: ClassName von Edit

  Alt 3. Mär 2021, 15: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
Antwort Antwort
Seite 1 von 2  1 2      


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 22:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz