Jupp, hier und überall sollten sich Millionen Beispiele finden lassen.
Erstmal das Suchen:
* Es gibt dutzende Programme, für sowas, wie z.B.
WinSpy oder [GOOGLE]Spy++[/GOOGLE]
und ich bin mir fast sicher, dass sich auch in der
DP mindestens ein Programm finden lässt.
* Aber es geht auch selbst:
Ein TEdit, zwei TMemo und ein TTimer (z.B. mit 100 ms Interval)
Delphi-Quellcode:
procedure TForm2.Timer1Timer(Sender: TObject);
var
P: TPoint;
H: HWND;
S: string;
L: Integer;
begin
GetCursorPos(P);
H := WindowFromPoint(P);
if H <> 0 then begin
SetLength(S, 256);
L := GetClassName(H, PChar(S), Length(S) + 1);
SetLength(S, L);
Edit1.Text := S;
L := GetWindowTextLength(H);
SetLength(S, L);
if L > 0 then
GetWindowText(H, PChar(S), L + 1);
Memo1.Text := S;
SetLength(S, 256); // ja, nachfolgend bin ich mal bissl schlampig (zeige auch nur den ClassName ohne die Caption/ComponentName, welche man aber für die Suche gebrauchen könnte, aber z.B. einfach die Maus auf die TitelLeiste ...)
Memo2.Lines.BeginUpdate;
Memo2.Clear;
while H <> 0 do begin
GetClassName(H, PChar(S), 256);
Memo2.Lines.Add(PChar(S));
H := GetParent(H);
end;
Memo2.Lines.EndUpdate;
end else begin
Edit1.Text := '(none)';
Memo1.Clear;
Memo2.Clear;
end;
end;
Und nun die Maus über den Bildschirm flutschen lassen.
Bezüglich dem Auslesen steckt oben schon der Code mit drin, für die Vorschau.
Man braucht nun also nur noch die
Handle der gwEdit-Controls.
HWND =
Wi
ndow
Handle
Für die Suche wurde das HWND des Controls unter dem Mauszeiger genommen,
aber jetzt nutzen wir den gefundenen Namen/Text, um damit das Control zu suchen.
FindWindow
FindWindowEx /
FindWindowEx
EnumWindows /
EnumWindows
Einmal lässt sich damit das gewünschte Fenster finden
und dann auf diesem Fenster auch die entsprechenden Edit-Controls.
Rate mal, warum Windows Windows heißt?
OK, eigentlich wegen der Fenster,
aber in Wirklichkeit ist zufällig
alles ein Fenster (Window) ... egal ob Fenster, Panel, PageControl, aber eben auch die einzelnen Edit-Controls und Buttons.
(außer die Anwendung malt alles selbst, wie z.B. im FireMonkey oder Java)
Und hat man z.B. einen Button gefunden, so läßt er sich auch drücken.
SendMessage/
PostMessage
mit BM_CLICK
oder WM_LBUTTONDOWN und WM_LBUTTONUP
oder WM_KEYDOWN und WM_KEYUP (VK_SPACE oder VK_RETURN).
PS: Delphi-TLabel sind keine "echten" WinControls, drum lässt sich so ihr Text nicht auslesen.
Das "echte" TEXT-Control wäre
TStaticText.
Außerdem lassen sich
disablete Controls nicht suchen, da sie nicht auf Messages reagieren und WindowFromPoint durch sie hindurch guckt, auf deren Parent.
Ein Therapeut entspricht 1024 Gigapeut.