Zitat von
Airblader:
@mael
ich seh ja, dass es zweifellos möglich ist, aber hieß es nicht deletzt hier irgendwo, dass labels kein
handle haben? *verwirrt ist*
Doch, schon richtig, Labels haben kein
Handle.
Die Idee ist: Finde die Form auf der das Label ist z.B. mit
RealChildWindowFromPoint(GetDesktopWindow, Point);
wobei Point die Bildschirm-Koordinaten der Maus wären.
Danach muß man ObjectFromHWnd verwenden um das dazu passende TForm-Objekt zu bekommen und per ReadProcessMemory die Felder in einen record einlesen. Dort ist besonders FComponents interessant, da sich dort die Liste der Komponenten und ihre Dimensionen bzw. Positionen befinden.
Es läßt sich also rausfinden welcher Punkt sich in welchem
VCL-Control befindet.
Delphi-Quellcode:
TComponentFieldsVCL3_VCL5 = record
//private
FSelf: Pointer;
FOwner: TComponent;
FName: TComponentName;
FTag: Longint;
FComponents: TList;
FFreeNotifies: TList;
FDesignInfo: Longint;
FVCLComObject: Pointer;
FComponentState: TComponentState;
//protected
FComponentStyle: TComponentStyle;
end;
Das mit dem record ist notwendig da leider Klassen je nach Delphi-Version etwas andere Speicherausrichtung haben und TForm selbst z.B. sich in der Felderreihenfolge und Anordnung auch von der Version abhängig ist. (daher auch VCL3_VCL5)
Um die Caption auszulesen habe ich den folgenden record verwendet (man muß noch ein bisschen mehr machen
Delphi-Quellcode:
{$ALIGN 2}
TControlFieldsVCL3 = record
//private
FParent: TWinControl;
FWindowProc: TWndMethod;
FLeft: Integer;
FTop: Integer;
FWidth: Integer;
FHeight: Integer;
FControlStyle: Word;
FControlState: Byte;
FDesktopFont: Boolean;
FVisible: Boolean;
FEnabled: Boolean;
FParentFont: Boolean;
FParentColor: Boolean;
FAlign: TAlign;
FDragMode: TDragMode;
FIsControl: Boolean;
FText: PChar;
FFont: TFont;
FColor: TColor;
FCursor: TCursor;
FDragCursor: TCursor;
FPopupMenu: TPopupMenu;
FHint: string;
FFontHeight: Integer;
FScalingFlags: TScalingFlags;
FShowHint: Boolean;
FParentShowHint: Boolean;
FOnMouseDown: TMouseEvent;
FOnMouseMove: TMouseMoveEvent;
FOnMouseUp: TMouseEvent;
FOnDragDrop: TDragDropEvent;
FOnDragOver: TDragOverEvent;
FOnStartDrag: TStartDragEvent;
FOnEndDrag: TEndDragEvent;
FOnClick: TNotifyEvent;
FOnDblClick: TNotifyEvent;
end;
Etwas tricky ist noch die Behandlung von Listen (wie FComponents), da alle dort vorkommenden Pointer auch wiederrum nur in der Fremdanwendung gültig sind, man also nicht die Objekte normal verwenden, sondern ReadProcessMemory einsetzen muß.
HTH,
Maël