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
TStaticText
. zwykły TLabel z punktu widzenia winapi nie jest kontrolką, jest tylko tekstem rysowanym bezpośrednio na formie za pomocą DrawText() albo TextOut().