![]() |
Edit einer Fremdanwendung füllen - Es will einfach nicht klappen
Hallo zusammen.
Seit gestern wühle ich mich durchs Forum und hab jetzt glaube alle Wege durch und nichts scheint zu klappen. Relativ einfache Geschichte. Ich habe ein kleines Programm welches ein Edit und 2 Buttons hat. In das Edit will ich mit meinem Delphiprogramm etwas eintragen und einen Knopf drücken. Soweit so klar. Findwindow, FindwindowEx, Sendmessage klappen aber einfach nicht. Den Findcode habe ich mir sowohl mal mit WinSpy als auch mit X-Spy generieren lassen. Beim debuggen wird wohl auch ein Handle ermittelt aber das Sendmessage scheint trotzdem nicht zu gehen. Hier mal der übersichtliche Code:
Code:
Bei WinSpy kann ich das Edit auswählen und auch via WinSpy füllen.
var
wnd, cwnd: HWND; begin wnd:=0; cwnd:=0; wnd := FindWindow('#32770', ''); cwnd := FindWindowEx(wnd, 0, 'Edit', nil); if cwnd <> 0 then begin SendMessage(cwnd,WM_Settext,0,integer(pchar('12'))); end; end; Nur per Delphi geht es irgendwie nicht. Kann man eine Anwendung gegen "Fremdsteuerung" schützen ? Wenn es hilft kann ich auch den Link zu der Exe posten die ich steuern will. |
AW: Edit einer Fremdanwendung füllen - Es will einfach nicht klappen
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; |
AW: Edit einer Fremdanwendung füllen - Es will einfach nicht klappen
|
AW: Edit einer Fremdanwendung füllen - Es will einfach nicht klappen
Such doch gleich nach dem Fenstertzitel.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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