AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Handle eines Speedbuttons einer fremden Anwendung ermitteln

Handle eines Speedbuttons einer fremden Anwendung ermitteln

Ein Thema von hitzi · begonnen am 6. Jul 2005 · letzter Beitrag vom 6. Jul 2005
Antwort Antwort
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#1

Handle eines Speedbuttons einer fremden Anwendung ermitteln

  Alt 6. Jul 2005, 11:56
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?
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 11:59
Ein TSpeedButton ist eine TGraphicControl und hat daher kein eigenes Fenster.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 11:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 12:01
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.
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 12:12
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...
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 15:09
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?
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 15:31
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;
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 15:40
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
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#9

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 15:43
Dein LoWord/HiWord macht keinen Sinn. Der lParam-Wert wird so berechnet: MakeLParam(x, y) oderLPARAM(Longword(Word(x)) or Longword(Word(y) shl 16))
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Handle eines Speedbuttons einer fremden Anwendung ermitt

  Alt 6. Jul 2005, 15:56
MakeLParam hat geholfen.

Dank dir bekomm ich jetzt einen Klick auf den Button hin. Vielen Dank dafür
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 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