Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Strings anderer Anwendungen verändern ? (https://www.delphipraxis.net/43280-strings-anderer-anwendungen-veraendern.html)

PierreB 31. Mär 2005 22:25


Strings anderer Anwendungen verändern ?
 
Schönen guten Mitternacht :hi:

ist es irgendwie möglich Strings einer anderen Anwendung zu ändern ? Zum Beispiel die Caption eines Labels. Wie macht man sowas ?

mael 31. Mär 2005 22:58

Re: Strings anderer Anwendungen verändern ?
 
Es ist möglich!

Bei Window-Controls wie TEdit und TForm geht dies mit der API SetWindowText.

Für VCL-Controls (die nicht auf TWinControl basieren) muß man andere Wege gehen.
Das geht mittels ReadProcessMemory und der ObjectFromHWnd-Funktion die zu einem gegebenen Handle den Pointer auf die Instanz des VCL-Objekt zurückgibt.
Wenn man die Form hat muß man dann durch die vorhandenen Controls durchiterieren. Ist etwas mühselig da man dauernd die Pointer der anderen Anwendung per ReadProcessMemory "dereferenzieren" muß und außerdem je nach Delphi-Version die auszulesenden Felder variieren.

Ich habe mal ein Programm gemacht das zumindest schon mal paar Informationen anzeigt wie Klassenhierarchie oder die Caption eines Labels.
Die Caption kann man nicht ändern, es sollte aber nicht zu schwer zu realisieren sein.

siehe hier: Property Edit

Airblader 31. Mär 2005 23:06

Re: Strings anderer Anwendungen verändern ?
 
@mael
ich seh ja, dass es zweifellos möglich ist, aber hieß es nicht deletzt hier irgendwo, dass labels kein handle haben? *verwirrt ist*

air

mael 31. Mär 2005 23:21

Re: Strings anderer Anwendungen verändern ?
 
Zitat:

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
Delphi-Quellcode:
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 :wink:

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

PierreB 1. Apr 2005 13:01

Re: Strings anderer Anwendungen verändern ?
 
Vielen Dank für die Antworten, ich guck das mal durch ob ichs verstehe. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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