Am direktesten geht das in AHK v2 über ControlGetText, ControlGetItems, ControlGetChecked oder notfalls per SendMessage an das fremde Control; entscheidend ist: Du musst das konkrete Child-Contro...
AHK2: ControlClick als SendMessage?
Antwort vom**Nein – `ControlClick` in AutoHotkey v2 ist nicht einfach „ein `SendMessage`“. Es nutzt je nach Situation mehrere Windows-Mechanismen; wenn du es per Nachricht nachbauen willst, sind meist `PostMessage`/`SendMessage` mit Mausnachrichten wie `WM_LBUTTONDOWN` und `WM_LBUTTONUP` der nähere Ersatz.** ## Der entscheidende Unterschied `ControlClick` ist eine AHK-Funktion auf höherer Ebene. Sie nimmt dir Dinge ab wie: - Ziel-Control finden - Koordinaten relativ zum Control berechnen - verschiedene Klickarten - teils robustere Zustellung als ein nacktes Message-Senden Ein echtes `SendMessage` ist dagegen nur: „Schicke genau diese Windows-Nachricht an genau dieses Fenster/Control.“ Praktisch heißt das: Wenn `ControlClick` funktioniert, ein manuelles `SendMessage` mit zwei Mausnachrichten funktioniert nicht automatisch genauso gut. ## Was man stattdessen meist sendet Für einen linken Klick auf ein Control sind typischerweise diese Nachrichten relevant: - `WM_LBUTTONDOWN` = `0x0201` - `WM_LBUTTONUP` = `0x0202` Oft eher mit `PostMessage` als mit `SendMessage`, weil echte Klickabläufe asynchroner wirken und manche Controls damit besser klarkommen. Beispiel in AHK v2: ```ahk hwnd := ControlGetHwnd("Button1", "ahk_exe notepad.exe") x := 10 y := 10 lParam := (y << 16) | (x & 0xFFFF) PostMessage(0x0201, 1, lParam, , "ahk_id " hwnd) ; WM_LBUTTONDOWN PostMessage(0x0202, 0, lParam, , "ahk_id " hwnd) ; WM_LBUTTONUP ``` ## Warum das trotzdem oft nicht identisch ist Viele moderne Programme reagieren nicht sauber auf einfache Mausnachrichten, weil sie: - eigene UI-Frameworks nutzen - keine klassischen Win32-Controls sind - Eingaben intern anders verarbeiten - nur echte Benutzereingaben akzeptieren Genau da liegt der wichtigste Praxispunkt: **Wenn `ControlClick` nicht geht, hilft ein bloßes Ersetzen durch `SendMessage` oft auch nicht.** Dann brauchst du eher: - `Click`/echte Mausbewegung - `ControlSend` - UI Automation / Accessibility - direkte Befehle des Programms - `BM_CLICK` bei klassischen Buttons ## Der oft bessere Spezialfall: `BM_CLICK` Bei normalen Win32-Buttons ist ein „Nachrichten-Klick“ oft nicht `WM_LBUTTONDOWN/UP`, sondern: - `BM_CLICK` = `0x00F5` Beispiel: ```ahk hwnd := ControlGetHwnd("Button1", "ahk_exe notepad.exe") SendMessage(0x00F5, 0, 0, , "ahk_id " hwnd) ; BM_CLICK ``` Das ist meist zuverlässiger als rohe Mausnachrichten, **aber nur für echte Button-Controls**. ## Klare Einordnung **`ControlClick` ist also kein Alias für `SendMessage`, sondern eine Komfortfunktion für Control-Interaktion.** Wenn du es „als Message“ ersetzen willst, gilt grob: - klassischer Button → eher `BM_CLICK` - echtes Mausereignis auf Control → `WM_LBUTTONDOWN/UP` - moderne/custom UI → Messages funktionieren oft gar nicht zuverlässig Der wichtigste Unterschied zu typischen Standardantworten ist: Nicht die Frage „welche Message entspricht `ControlClick`?“ ist entscheidend, sondern **welcher Control-Typ das Ziel ist**. Ohne diesen Unterschied sucht man oft an der falschen Stelle.