Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Handle eines Speedbuttons einer fremden Anwendung ermitteln (https://www.delphipraxis.net/49155-handle-eines-speedbuttons-einer-fremden-anwendung-ermitteln.html)

hitzi 6. Jul 2005 10:56


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 WinSpy probiert. Dieses Programm zeigt aber auch keine Informationen über den Button an, wenn ich die Maus drüber bewege.

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?

Robert Marquardt 6. Jul 2005 10:59

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
 
Ein TSpeedButton ist eine TGraphicControl und hat daher kein eigenes Fenster.

NicoDE 6. Jul 2005 10:59

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
 
Zitat:

Zitat von hitzi
Hat es etwas damit zu tun, weil der Speedbutton keinen Focus erhalten kann?

Hat eher was damit zu tun, dass es kein eigenes Fenster-Objekt ist, sondern Teil des 'Parents', der für die Logik und das Zeichnen zuständig ist.

hitzi 6. Jul 2005 11:01

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:
      SetCursorPos(LEFT, TOP);
      mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); //drücken
      mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); // loslassen
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.

NicoDE 6. Jul 2005 11:12

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
 
Zitat:

Zitat von hitzi
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.

...und es wohl, wie man in einem anderen Thread nachlesen kann, nicht funktioniert, wenn der Benutzer den Desktop gesperrt hat.

Versuch mit einem Spy heraus zu finden, welche Nachrichten an das Fenster gehen und schick sie ihm...

hitzi 6. Jul 2005 14:09

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:
          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));
Ist etwas am Code falsch oder die ganze Herangehensweise?

NicoDE 6. Jul 2005 14:31

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;

hitzi 6. Jul 2005 14:40

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:
          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));
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 :(

NicoDE 6. Jul 2005 14:43

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt
 
Dein LoWord/HiWord macht keinen Sinn. Der lParam-Wert wird so berechnet:
Delphi-Quellcode:
MakeLParam(x, y)
oder
Delphi-Quellcode:
LPARAM(Longword(Word(x)) or Longword(Word(y) shl 16))

hitzi 6. Jul 2005 14:56

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