Einzelnen Beitrag anzeigen

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