In diesem Artikel wird anhand von Beispielen ausführlich erläutert, wie Delphi Handles erhält und Nachrichten sendet.
Suchen Sie den Handle eines anderen Fensters:
handle := FindWindow(nil,PChar('Titel des Fensters'));//Finde das Formularhandle
Unterformulare finden:
childHandle := FindWindowEx(handle,0,'subform class','subform title');
Es gibt auch eine API zum Aufzählen von Unterformularen.
EnumChildWindows(Hauptkörper-Handle, @callback-Funktion, Benutzerparameter);
Um diese Funktion verwenden zu können, müssen Sie selbst eine Rückruffunktion schreiben, z. B.:
function EnumChildProc(ahWND:HWND; param:LPARAM):boolean; stdcall;sendmessage(handle,message,wl,rl)
Unit Unit1; Schnittstelle verwendet Windows,Messages,Tlhelp32,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;type TForm1=class(TForm)procedure FormCreate(Sender: TObject); private {Private Deklarationen} public {Öffentliche Deklarationen} end; var Form1: TForm1;implementation{ $R *.DFM}prozedur TForm1.FormCreate(Sender: TObject);var a,b:PAnsiChar;h:HWND;beginh:= FindWindow(nil,'abc.txt - Notepad');h:= FindWindowEx(h,0,'edit', nil );SendMessage(h,WM_SETTEXT,255,Integer(PChar('Ich bin hier, um zu messen')));ShowMessage( IntToStr(h));end;
SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); Stellen Sie die TV-Hintergrundfarbe ein SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0); Drücken Sie die linke Maustaste SendMessage(Button.Handle,WM_LBUTTONUP , 0,0); Heben Sie die linke Maustaste an SendMessage(Edit.Handle,WM_SETTEXT,255,Integer(PChar('abc'))); Übergeben Sie den Text SendMessage(Edit.Handle,WM_Char,Wparam('Q'),2); Übergeben Sie das Zeichen SendMessage( Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1); Schaltflächenstil ändern SendMessage(ComboBox.Handle,CB_SETDropPEDWIDTH,300,0); CBDownWidth ändern
WM_CUT, WM_COPY und WM_PASTE Ausschneiden, Kopieren, Einfügen
Implementieren Sie eine beliebige Tastenkombination:
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0);keybd_event(ord('V') , MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0);keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);
Beschreibung von SendMessageA: Rufen Sie die Fensterfunktion eines Fensters auf, um eine Nachricht an dieses Fenster zu senden. Diese Funktion kehrt erst zurück, wenn die Nachricht verarbeitet wird
SendMessage enthält 4 Parameter:
1. hwnd 32-Bit-Fenster Das Handle-Fenster kann jede Art von Bildschirmobjekt sein, da Win32 Handles für die meisten visuellen Objekte verwalten kann
2. wMsg ist ein konstanter Wert, der zur Unterscheidung anderer Nachrichten verwendet wird. Diese Konstanten können vordefinierte Konstanten in Windows-Einheiten oder benutzerdefinierte Konstanten sein.
3. wParam ist normalerweise ein konstanter Wert, der sich auf die Nachricht bezieht, oder es kann das Handle des Fensters oder Steuerelements sein
4. lParam ist normalerweise ein Zeiger, der auf Daten im Speicher zeigt. Da WParm, lParam und Pointer alle 32-Bit sind, können sie ineinander konvertiert werden.
Detaillierte Beschreibung der wMsg-Funktion:
★WM_Create erstellt ein Fenster
★WM_DESTROY Wird gesendet, wenn ein Fenster zerstört wird
★WM_MOVE Ein Fenster verschieben
★WM_SIZE Ändern Sie die Größe eines Fensters
★WM_ACTIVATE Ein Fenster wird aktiviert oder deaktiviert
★WM_SETFOCUS Ein Fenster erhält den Fokus
★WM_KILLFOCUS Ein Fenster verliert den Fokus
★WM_ENABLE ändert ein Fenster in den Status „Aktivieren“.
★WM_SETREDRAW Legt fest, ob das Fenster neu gezeichnet werden kann
★WM_SETTEXT Die Anwendung sendet diese Nachricht, um den Text eines Fensters festzulegen
★WM_GETTEXT Die Anwendung sendet diese Nachricht, um den Text des entsprechenden Fensters in den Puffer zu kopieren.
★WM_GETTEXTLENGTH Ruft die Länge des Texts ab, der sich auf ein Fenster bezieht (ohne Nullzeichen).
★WM_PAINT fordert ein Fenster auf, sich selbst neu zu zeichnen
★WM_CLOSE sendet ein Signal, wenn ein Fenster oder eine Anwendung geschlossen werden soll.
★WM_QUERYENDSESSION Der Benutzer entscheidet sich dafür, das Dialogfeld zu beenden, oder das Programm ruft die ExitWindows-Funktion selbst auf
★WM_QUIT wird verwendet, um die Programmausführung zu beenden
★WM_QUERYOPEN Wenn das Benutzerfenster in seiner vorherigen Größe und Position wiederhergestellt ist, senden Sie diese Nachricht an ein Symbol
★WM_ERASEBKGND Wenn der Fensterhintergrund gelöscht werden muss (z. B. wenn das Fenster seine Größe ändert)
★WM_SYSCOLORCHANGE Wenn sich die Systemfarbe ändert, senden Sie diese Nachricht an alle Fenster der obersten Ebene
★Nach der WM_QUERYENDSESSION-Nachricht wird diese Nachricht an die Anwendung gesendet, um sie darüber zu informieren, ob die Konversation beendet ist.
★WM_SHOWWINDOW Diese Nachricht wird an dieses Fenster gesendet, wenn das Fenster ausgeblendet oder angezeigt wird.
★WM_ACTIVATEAPP sendet diese Nachricht an die Anwendung, welches Fenster aktiv und welches inaktiv ist.
★WM_FONTCHANGE Diese Nachricht wird an alle Fenster der obersten Ebene gesendet, wenn sich die Schriftartressourcenbibliothek des Systems ändert.
★WM_TIMECHANGE Senden Sie diese Nachricht an alle Fenster der obersten Ebene, wenn sich die Systemzeit ändert
★WM_CANCELMODE Senden Sie diese Nachricht, um einen laufenden Modus (Vorgang) abzubrechen.
★WM_SETCURSOR Wenn die Maus bewirkt, dass sich der Cursor in einem Fenster bewegt
★WM_ENDSESSION Wenn beim Systemprozess Probleme auftreten und Mauseingaben nicht erfasst werden, wird eine Nachricht an ein Fenster gesendet.
★WM_MOUSEACTIVATE sendet diese Nachricht an das aktuelle Fenster, wenn sich der Cursor in einem inaktiven Fenster befindet und der Benutzer eine Maustaste drückt.
★WM_CHILDACTIVATE Senden Sie diese Nachricht an das untergeordnete MDI-Fenster, wenn der Benutzer auf die Titelleiste dieses Fensters klickt oder wenn das Fenster aktiviert, verschoben oder in der Größe geändert wird
★WM_QUEUESYNC Diese Nachricht wird von einem computerbasierten Trainingsprogramm gesendet, und die Benutzereingabenachricht wird durch das Hook-Programm WH_JOURNALPALYBACK getrennt
★WM_GETMINMAXINFO Diese Nachricht wird an das Fenster gesendet, wenn es dabei ist, Größe oder Position zu ändern.
★WM_PAINTICON Wird an ein minimiertes Fenster gesendet, wenn dessen Symbol neu gezeichnet werden soll
★WM_ICONERASEBKGND Diese Nachricht wird nur dann an ein minimiertes Fenster gesendet, wenn dessen Hintergrund vor dem Zeichnen des Symbols neu gezeichnet werden muss.
★WM_NEXTDLGCT★Senden Sie diese Nachricht an ein Dialogfensterprogramm, um die Fokusposition zu ändern
★WM_SPOOLERSTATUS Diese Meldung wird jedes Mal ausgegeben, wenn ein Auftrag zur Druckverwaltungswarteschlange hinzugefügt oder daraus entfernt wird.
★WM_DRAWITEM Wird gesendet, wenn sich das visuelle Erscheinungsbild von Schaltflächen, Kombinationsfeldern, Listenfeldern und Menüs ändert
★WM_MEASUREITEM Wenn eine Schaltfläche, ein Kombinationsfeld, ein Listenfeld, ein Listenansichtssteuerelement oder ein Menüelement erstellt wird
★WM_VKEYTOITEM Diese Nachricht hat einen LBS_WANTKEYBOARDINPUT-Stil, der an seinen Besitzer als Antwort auf die WM_KEYDOWN-Nachricht ausgegeben wird
★WM_CHARTOITEM Diese Nachricht wird von einem Listenfeld im LBS_WANTKEYBOARDINPUT-Stil als Antwort auf die WM_CHAR-Nachricht an seinen Besitzer gesendet
★WM_SETFONT Beim Zeichnen von Text sendet das Programm diese Nachricht, um die Farbe abzurufen, die vom Steuerelement verwendet werden soll.
★WM_GETFONT Die Anwendung sendet diese Nachricht, um die Schriftart des vom aktuellen Steuerelement gezeichneten Textes abzurufen.
★WM_SETHOTKEY Die Anwendung sendet diese Nachricht, um ein Fenster mit einem Hotkey zu verknüpfen.
★WM_GETHOTKEY Die Anwendung sendet diese Nachricht, um festzustellen, ob der Hotkey einem Fenster zugeordnet ist
★WM_QUERYDRAGICON Diese Nachricht wird an ein minimiertes Fenster gesendet und es ist kein Symbol in seiner Klasse definiert. Das System zeigt dieses Symbol oder diesen Cursor an Der Benutzer zieht das Symbol per Drag & Drop.
★WM_COMPAREITEM Senden Sie diese Nachricht, um die relative Position neu hinzugefügter Elemente in der Combobox oder Listbox zu bestimmen
★WM_COMPACTING zeigt an, dass der Speicher sehr niedrig ist.
★WM_WINDOWPOSCHANGING Senden Sie diese Nachricht an die Funktion setwindowpos oder andere Fensterverwaltungsfunktionen, wenn Größe und Position des Fensters geändert werden sollen.
★WM_WINDOWPOSCHANGED Senden Sie diese Nachricht an die Funktion setwindowpos oder andere Fensterverwaltungsfunktionen, wenn Größe und Position des Fensters geändert wurden.
★WM_POWER Diese Nachricht wird gesendet, wenn das System kurz davor steht, in den Pausenzustand zu wechseln.
★WM_COPYDATA Diese Nachricht wird gesendet, wenn eine Anwendung Daten an eine andere Anwendung übergibt
★WM_CANCELJOURNA Wenn ein Benutzer den Aktivierungsstatus des Programmprotokolls abbricht, senden Sie diese Nachricht an das Programm
★WM_NOTIFY Wenn ein Ereignis eines Steuerelements aufgetreten ist oder das Steuerelement Informationen abrufen muss, wird diese Nachricht an das übergeordnete Fenster gesendet.
★WM_INPUTLANGCHANGEREQUEST Wenn der Benutzer eine Eingabesprache auswählt oder sich der Hotkey der Eingabesprache ändert
★WM_INPUTLANGCHANGE Diese Nachricht wird an das betroffene Fenster der obersten Ebene gesendet, wenn die Plattformszene geändert wurde.
★WM_TCARD Diese Nachricht wird an die Anwendung gesendet, wenn das Programm die Windows-Hilferoutine initialisiert hat.
★WM_HELP Diese Nachricht zeigt an, dass der Benutzer F1 gedrückt hat. Wenn ein Menü aktiviert ist, wird diese Nachricht an das mit diesem Fenster verknüpfte Fenster gesendet Es wird eine Nachricht für das aktuell aktive Fenster gesendet
★WM_USERCHANGED Diese Nachricht wird an alle Fenster gesendet, nachdem sich der Benutzer an- oder abgemeldet hat. Wenn sich der Benutzer an- oder abmeldet, aktualisiert das System die spezifischen Einstellungsinformationen des Benutzers.
★WM_NOTIFYFORMAT Öffentliche Steuerelemente, benutzerdefinierte Steuerelemente und ihre übergeordneten Fenster verwenden diese Nachricht, um zu bestimmen, ob das Steuerelement eine ANSI- oder UNICODE-Struktur verwendet.
function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean; var buffer: array[0..255] of char; begin Result := True; if StrPas(Buffer)='Edit' then begin SendMessage(hwnd,WM_GETTEXT,256,lparam); Ergebnis:=False; end; procedure TForm1.Button1Click(Sender: TObject); var hwnd: Integer: array[0..255] of char; if hwnd<> 0 then begin EnumChildWindows (hwnd,@EnumChildWindowsProc,Longint(@buffer[0])); StrPas(buffer); end; end;