AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Control Handle unter dem Mauscursor
Thema durchsuchen
Ansicht
Themen-Optionen

Control Handle unter dem Mauscursor

Ein Thema von Neotracer · begonnen am 2. Jan 2012 · letzter Beitrag vom 2. Jan 2012
Antwort Antwort
Neotracer

Registriert seit: 14. Jul 2010
17 Beiträge
 
Delphi 7 Personal
 
#1

Control Handle unter dem Mauscursor

  Alt 2. Jan 2012, 02:26
Hallo,

ich habe folgenden Code um das Window Handle vom Control unter der Maus herauszufinden:
(calc.exe als Beispiel)

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  ahwnd: HWND;
  aPoint: Tpoint;
begin
  ahwnd := FindWindow('CalcFrame','Rechner');

  aPoint := Mouse.CursorPos;
  Windows.ScreenToClient(ahwnd,aPoint);

  Label1.Caption := 'X: '+IntToStr(aPoint.X);
  Label2.Caption := 'Y: '+IntToStr(aPoint.Y);

  aHwnd := ChildWindowFromPoint(ahwnd,aPoint);
  Edit1.Text := IntToStr(aHwnd);
end;
Allerdings bekomme ich nur das Window von einem Panel tiefer, aber nicht die Handle vom Button selbst.
Hier sieht man's:

http://www.abload.de/img/failzgajj.jpg

Was mache ich falsch?

Danke schonmal.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Control Handle unter dem Mauscursor

  Alt 2. Jan 2012, 08:23
nimm statt ChildWindowFromPoint die Funktion WindowFromPoint ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Neotracer

Registriert seit: 14. Jul 2010
17 Beiträge
 
Delphi 7 Personal
 
#3

AW: Control Handle unter dem Mauscursor

  Alt 2. Jan 2012, 15:33
Stimmt, das geht.

Aber ich wollte ja eigentlich von Client Koordinaten + Client Window -> Control Handle kommen.
Jetz habe ich Screen Koordinaten -> Control Handle.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.620 Beiträge
 
Delphi 12 Athens
 
#4

AW: Control Handle unter dem Mauscursor

  Alt 2. Jan 2012, 15:42
Könnte man nicht mit MSDN-Library durchsuchenGetParent und MSDN-Library durchsuchenGetWindowRect die Koordinaten des übergeordneten Fensters holen und so die Client-Koordinaten selber berechnen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Neotracer

Registriert seit: 14. Jul 2010
17 Beiträge
 
Delphi 7 Personal
 
#5

AW: Control Handle unter dem Mauscursor

  Alt 2. Jan 2012, 15:51
Aber das erste übergeordnete Fenster von dem Control was ich kriege, muss ja nicht unbedingt das Fenster sein, von dem ich ausgehen will?

Wobei: Ich könnte solange GetParent loopen bis ich das Client Window hab, von dem ich ausgehen will. Das könnte ich probieren. Danke.
  Mit Zitat antworten Zitat
Neotracer

Registriert seit: 14. Jul 2010
17 Beiträge
 
Delphi 7 Personal
 
#6

AW: Control Handle unter dem Mauscursor

  Alt 2. Jan 2012, 17:30
Irgendetwas stimmt noch nicht ganz.

Hab mir jetzt folgendes gebastelt:

Delphi-Quellcode:
function WindowFromRelativePoint(wnd: HWND; pt: TPoint): HWND;
var
  r: TRect;
begin
  GetWindowRect(wnd,r);
  pt.X := pt.X + r.Left;
  pt.Y := pt.Y + r.Top;

  //Form1.Label3.Caption := 'X: '+IntToStr(pt.X);
  //Form1.Label4.Caption := 'Y: '+IntToStr(pt.Y);

  result := WindowFromPoint(pt);
end;
Die Funktion rufe ich so auf:

Delphi-Quellcode:
  ahwnd := FindWindow('CalcFrame','Rechner');

  aPoint := Mouse.CursorPos;

  //Label1.Caption := 'X: '+IntToStr(aPoint.X);
  //Label2.Caption := 'Y: '+IntToStr(aPoint.Y);

  Windows.ScreenToClient(ahwnd,aPoint);

  aHwnd := WindowFromRelativePoint(ahwnd, aPoint);

Folgendes passiert:
- absolute Mauskoordinaten werden geholt
- Umgerechnet auf ClientKoordinaten des Fensters von calc.exe (ScreenToClient)
- Relative Koordinaten werden meiner Funktion übergeben
- Meine Funktion holt sich das WindowRect und rechnet wieder in absolute Koordinaten um, damit WindowFromPoint funktioniert.

So. Als Test habe ich nun beides mal in Labels die Koordinaten ausgegeben.
- Einmal die absoluten Koordinaten der Maus direkt
- beim zweiten mal in der Funktion, wo die relativen wieder zu absoluten Koordinaten umgerechnet werden sollen.

Also müssten am Ende beide Label-Paare die gleichen Koordinaten ausgeben, richtig?
Ist blöderweise nicht sooo...
Wenn ich die Maus ganz oben links in die Ecke schiebe, dann habe ich beim ersten Labelpaar (0,0) aber beim zweiten irgendetwas anderes?! (-3,-41)

Übrigens auch unabhängig davon wo ich das Fenster von calc.exe hinschiebe.

Was mache ich falsch? Man muss doch von absoluten zu Client-Koordinaten und wieder zurückrechnen können, ohne, dass da solche Ungenauigkeiten auftreten?

//EDIT:
Es geht jetzt mit ClientToScreen anstatt selbst zu rechnen. Wäre trotzdem interessant zu wissen, was an der Rechnung falsch ist.

Geändert von Neotracer ( 2. Jan 2012 um 17:43 Uhr)
  Mit Zitat antworten Zitat
Neotracer

Registriert seit: 14. Jul 2010
17 Beiträge
 
Delphi 7 Personal
 
#7

AW: Control Handle unter dem Mauscursor

  Alt 2. Jan 2012, 18:43
ScreenToClient/ClientToScreen baut irgendwie Mist.
Ich übergebe das MainWindow und er rechnet mit dem ersten Child... bei calc.exe zumindest.

Habe mit jetzt eigene Funktionen geschrieben. Geht wunderbar.

Delphi-Quellcode:
procedure ScreenToClient2(wnd: HWND; var pt: TPoint);
var
  r: TRect;
begin
  if GetWindowRect(wnd, r) then
  begin
    pt.X := pt.X - r.Left;
    pt.Y := pt.Y - r.Top;
  end;
end;

procedure ClientToScreen2(wnd: HWND; var pt: TPoint);
var
  r: TRect;
begin
  if GetWindowRect(wnd, r) then
  begin
    pt.X := pt.X + r.Left;
    pt.Y := pt.Y + r.Top;
  end;
end;

function WindowFromRelativePoint(wnd: HWND; pt: TPoint): HWND;
begin
  ClientToScreen2(wnd,pt);
  result := WindowFromPoint(pt);
end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:19 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