![]() |
ClassName von Edit
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:
Dafür brauche ich den ClassName. Der ändert sich aber:
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; 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 |
AW: ClassName von Edit
Ä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. |
AW: ClassName von Edit
Das Problem ist, dass das Edit kein Caption hat...
Was meinst Du mit PID? |
AW: ClassName von Edit
Ich meinte Caption vom Ziel-Fenster.
PID = ProcessID |
AW: ClassName von Edit
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:
Um text zu ändern.
SendMessage(GetDlgItem(dasHandle, dieControlID), WM_SETTEXT, 0, Integer(PChar('neuer Text')));
|
AW: ClassName von Edit
Liste der Anhänge anzeigen (Anzahl: 1)
Am Ende ist das mein Problem: Der ClassName ändert sich...
Ich hatte folgendes probiert, aber damit komme ich nicht weiter:
Delphi-Quellcode:
Ich wollte einfach mal sehen, welche ID's er findet - leider immer 0.
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 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 |
AW: ClassName von Edit
Zitat:
Wenn du meinen vorschlag von oben folgst, ist classname oder handle dank GetDlgItem() überflüssig. |
AW: ClassName von Edit
Zitat:
Ein 0 bis 50 durchiterieren bringt da nichts. |
AW: ClassName von Edit
Zitat:
Ich habe es jetzt so versucht:
Delphi-Quellcode:
wnd hat dann des Wert von Empfänger (263610)
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))); 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
Delphi-Quellcode:
zurückliefert - leider immer nur eine 0.
GetDlgItem(fwnd, 5)
Irgendwie habe ich es noch nicht geblickt... |
AW: ClassName von Edit
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?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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