![]() |
Handle eines Speedbuttons einer fremden Anwendung ermitteln
Hallo
wie kann ich das Handle eines Speedbuttons einer fremden Anwendung ermitteln? Über EnumChildWindows wird mir dieses Control nicht angezeigt. Ich habe es auch schon mit dem Programm ![]() Hat es etwas damit zu tun, weil der Speedbutton keinen Focus erhalten kann? EDIT: Hab gerade gelesen, dass ein Speedbutton kein Handle besitzt. Wie kann ich einen Klick auf den Button Simulieren? |
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
Ein TSpeedButton ist eine TGraphicControl und hat daher kein eigenes Fenster.
|
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
Zitat:
|
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
Da war ich mit dem EDIT im ersten Post zu langsam :)
Deshalb nochmal an dieser Stelle meine Frage - wie kann ich einen Klick auf so einen Button in einer fremden Anwendung simulieren. Und wieder ein EDIT:
Delphi-Quellcode:
sollte mir helfen. Gibt es einen eleganteren Weg die Funktion hinter dem Klick auf den Button in der fremden Anwendung auszulösen, da durch die oben genannten Befehle der Mauscursor tatsächlich an diese Position gesetzt wird und auch noch das ferngesteuerte Fenster im Vordergrund und aktiv sein muss.
SetCursorPos(LEFT, TOP);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); //drücken mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); // loslassen |
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
Zitat:
Versuch mit einem Spy heraus zu finden, welche Nachrichten an das Fenster gehen und schick sie ihm... |
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
Laut WinSight werden beim Druck auf diesen Button nur die Nachrichten WM_SETCURSOR, WM_LBUTTONDOWN und WM_LBUTTONUP ausgelöst.
Ich habe mal diese Nachrichten an das Fenster geschickt - leider wird der Button nicht gedrückt :( Genutzt habe ich folgenden Code:
Delphi-Quellcode:
Ist etwas am Code falsch oder die ganze Herangehensweise?
GetWindowRect(WindowHandle, MyRect); //WindowHandle ist das Handle zu dem Fenster mit dem Speedbutton
SendMessage(WindowHandle, WM_SetCursor, WindowHandle, LoWord((MyRect.Right - MyRect.Left) - 100) + HiWord((MyRect.Bottom - MyRect.Top) - 56)); SendMessage(WindowHandle, WM_LButtonDown, MK_LBUTTON, LoWord((MyRect.Right - MyRect.Left) - 100) + HiWord((MyRect.Bottom - MyRect.Top) - 56)); SendMessage(WindowHandle, WM_LButtonUp, 0, LoWord((MyRect.Right - MyRect.Left) - 100) + HiWord((MyRect.Bottom - MyRect.Top) - 56)); |
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
WM_MOUSEMOVE, WM_LBUTTONDOWN und WM_LBUTTONUP sind laut Dokumentation Nachrichten die per PostMessage versand werden:
Delphi-Quellcode:
const
x = 10; y = 10; xy = x or y shl 16; var Wnd: HWND; begin Wnd := FindWindow('TForm1', 'Form1'); if Wnd = HWND(nil) then begin ShowMessage('Fenster nicht gefunden'); Exit; end; PostMessage(Wnd, WM_MOUSEMOVE , 0 , xy); PostMessage(Wnd, WM_LBUTTONDOWN, MK_LBUTTON, xy); PostMessage(Wnd, WM_LBUTTONUP , 0 , xy); end; |
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
WM_MOUSEMOVE kann ich also auch für WM_SETCURSOR verwenden. Hab's geändert, aber leider ohne Effekt.
Delphi-Quellcode:
Die übergebenen Koordinaten sollen sich laut MSDN auf das Fenster beziehen. Bei WinSight bekommt man ja auch die Parameter bei WM_SetCursor angezeigt und konnte so die Position des Buttons im Fenster in Abhängigkeit der Fenstergröße bestimmen. Die errechneten Koordinaten stimmen mit denen bei WinSight überein. Trotz allem wird kein Mausklick ausgelöst :(
GetWindowRect(WindowHandle, MyRect);
PostMessage(WindowHandle, WM_MouseMove, 0, LoWord((MyRect.Right - MyRect.Left) - 100) + HiWord((MyRect.Bottom - MyRect.Top) - 56)); PostMessage(WindowHandle, WM_LButtonDown, MK_LBUTTON, LoWord((MyRect.Right - MyRect.Left) - 100) + HiWord((MyRect.Bottom - MyRect.Top) - 56)); PostMessage(WindowHandle, WM_LButtonUp, 0, LoWord((MyRect.Right - MyRect.Left) - 100) + HiWord((MyRect.Bottom - MyRect.Top) - 56)); |
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
Dein LoWord/HiWord macht keinen Sinn. Der lParam-Wert wird so berechnet:
Delphi-Quellcode:
oder
MakeLParam(x, y)
Delphi-Quellcode:
LPARAM(Longword(Word(x)) or Longword(Word(y) shl 16))
|
Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
MakeLParam hat geholfen.
Dank dir bekomm ich jetzt einen Klick auf den Button hin. Vielen Dank dafür :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz