Pobranie pozycji kontroli innego okna

0

Witam,

Usiłuję pobrać LEFT i TOP kontrolki która leży na innym oknie, biorąc pod uwagę fakt, że okienko może zmienić swoją pozycję.

Póki co mój kod wygląda tak:

var
  Pos: TPoint;
  Control_HWND, Window_HWND: THandle;

// Funkcja dodaje do ListView pozycję kontrolki 
// następnie zapisuje pozycję do listview
procedure TForm1.AddAction(Action: string; H: HWND; Rect: TRect; Deelay: string);
var
  Item: TListItem;
begin
  Item := ActionList.Items.Add;
  Item.Caption := IntToStr(ActionList.Items.Count);
  Item.SubItems.Add(Action);
  Item.SubItems.Add(IntToStr(H));
  Item.SubItems.Add(IntToStr(Rect.Left));
  Item.SubItems.Add(IntToStr(Rect.Top));
  Item.SubItems.Add(IntToStr(Rect.Width));
  Item.SubItems.Add(IntToStr(Rect.Height));
  Item.SubItems.Add(Deelay);
end;

// Zdarzenie np. przycisku onClick
AddAction('LPM', GetHWND, GetControlPos, '');

// Funkcja pobiera uchwyt okna nad którym znajduje się kursor
function TForm1.GetHWND: THandle;
var
  hWnd: THandle;
  aName: array [0..255] of Char;
begin
  GetCursorPos(Pos);
  hWnd := WindowFromPoint(Pos);

  if Boolean(GetClassName(hWnd, aName, 256)) then
    Result := hWnd;
end;

// Funkcja pobiera pozycję okna na podstawie uchwytu
function TForm1.GetWindowPos: TRect;
var
  Rect: TRect;
begin
  Window_HWND := GetForegroundWindow();
  GetWindowRect(Window_HWND, Rect);
  Result := Rect;
end;

Problem jest taki, że gdy wykonam taką procedurę:

var
  i: integer;
begin
  for I := 0 to ActionList.Items.Count -1 do
  begin
    Sleep(150);
    Application.ProcessMessages;
   SetCursorPos(GetWindowPos.Left + StrToInt(ActionList.Items[i].SubItems[2]) + (StrToInt(ActionList.Items[i].SubItems[4]) div 2),   GetWindowPos.Top + StrToInt(ActionList.Items[i].SubItems[3]) + (StrToInt(ActionList.Items[i].SubItems[5]) div 2));
  end;

Kursor ustawia się (co prawda w tym samym oknie) ale całkiem innym miejscu niż znajdują się kontrolki.

W jaki sposób mogę pobrać dokładne położenie komponentu na innym oknie biorąc pod uwagę LEFT i TOP okna pod którym znajduje się kursor?

Na formie LEFT Button-u wynosi 25, ale pobierając położenie za pomocą funkcji GetControlPos.Left zwraca mi np. 260 tak jak by brał od krawędzi ekranu.

W skrócie:
Mamy otwarty Notatnik, klikam w dowolnym miejscu na edytor tekstu. W moim programie dodaje się do ListView pozycja kliknięcia.
Przesuwam okno notatnika w inne miejsce, klikam w dowolnym miejscu na edytorze, dodaję pozycję do ListView.
Zamykam notatnik, uruchamiam go ponownie. Uruchamiam w swoim programie pętle po ListView z zapamiętanymi pozycjami kliknięć i chciałbym, aby kursor pojawiał się w dokładnie tych miejscach mimo, że tym razem nie będę zmieniał pozycji okienka notatnika.

Czyli, żeby pozycja była zapamiętywana w ten sposób:

Notatnik.Left + Notatnik.Kliknięcie.Left;
Notatnik.Top + Notatnik.Kliknięcie.Top;

Z góry dziękuję za pomoc

dodanie znaczników <code class="delphi"> - fp

0

Nie wiem mam ciężką głowę dzisiaj ale to chyba trzeba przeliczyć chyba ClientToScreen (a może ScreenToClient ciężko mi się myśli dzisiaj)

0

Poradziłem sobie już z ustawianie pozycji kursora na kontrolce, ale mam inny problem.

Dlaczego przesuwając kursor nad oknami i ich kontrolkami - widzę ich uchwyty, ale jak najadę kursorem na LABEL to zwracam mi uchwyt formy?

0

Label z Delphi nie ma uchwytu.

0

W takim razie, jak działa zdarzenie OnMouseEnter labelu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1