Jak pobrać pozycję przycisku Minimalizuj?

0

Cześć,

mam problem z pobraniem pozycji przycisków tytułowych okien. Problem dotyczy tylko nich, ponieważ ta sama funkcja, która zawraca mi pozycje kontrolki znajdującej się pod kursorem działa prawidłowo dla wszystkich kontrolek wewnątrz okien Windows.

Tak wygląda wypełniony obiekt, zawierający dane odczytane spod kursora za pomocą

Funkcja pobierająca współrzędne kontrolki na podstawie uchwytu:

function GetControlXY(Wnd: HWND): TPoint;
var
  p: TPoint;
  Rect: TRect;
begin
  // Pobierz pozycję kontrolki/okna na podst. uchwytu
  GetWindowRect(Wnd, Rect);
  p.X := Rect.Left;
  p.Y := Rect.Top;

  Result := p;
end;

wypełniony obiekt z danymi spod kursora wygląda następująco:

object TDaneKursora
  NazwaProcesu="explorer"
  NazwaOkna="spyxx14"
  KlasaOkna="CabinetWClass"
  OpisKontrolki="spyxx14"
  KlasaKontrolki="CabinetWClass"
  object _PozycjaKontrolki
    pozX=610
    pozY=344
  end
  object _PozycjaOkna
    pozX=610
    pozY=344
  end
  object _PozycjaNaKontrolce
    pozX=915
    pozY=16
  end
  object _PozycjaNaOknie
    pozX=915
    pozY=16
  end
  object _PozycjaKursora
    pozX=1525
    pozY=360
  end
end

a tak wyliczam pozycje na kontrolce i pozycje na oknie:

// pomUchwytOknaKontrolki to HWND
// p_Pozycja to współrzędne kursora na ekranie

pomUchwytOknaKontrolki := WindowFromPoint (p_Pozycja);
OpisKontrolki      := GetCaptionFromHandle (pomUchwytOknaKontrolki);
KlasaOkna          := GetMainWindowClassName (pomUchwytOknaKontrolki);
PozycjaKursora     := p_Pozycja; 
PozycjaOkna        := GetWindowPos(KlasaOkna, OpisKontrolki);
PozycjaKontrolki   := GetControlXY (pomUchwytOknaKontrolki);
PozycjaNaKontrolce := PozycjaKursora - PozycjaKontrolki; // pozycja kursora względem kontrolki np. buttona
PozycjaNaOknie     := PozycjaKursora - PozycjaOkna; // pozycja kursora względem okna

jak widać klasa okna to CabinetWClass tak samo jak klasa kontrolki.
W załączniku zrzut okno otwartego folderu wygląda w Spy++ oraz samego okna.

Kursor ustawiam na podstawie współrzędnych:

var
  pomKursorPos: TPoint;
begin
pomKursorPos := PozycjaKontrolki + PozycjaNaKontrolce

Moja aplikacja nagrywa ruchy kursora, które później ma naśladować razem z kliknięciami, niestety w przypadku kliknięcia na przyciski na pasku tytułowym, kursor ustawia się jakieś 4 cm pod nim.

0

Czy jesteś w stanie dać tutaj jakiś działający projekt pokazujący to zachowanie? Bo szczerze mówiąc to chętnie bym się tym pobawił, ale nie chce mi się tworzyć projektu, przepisywać kodu itp.

0

Nie jestem w stanie, ponieważ mój projekt korzysta z dedykowanego Framework-a, który w sumie zawiera kilkaset MB, a do tego projekt zawiera własne komponenty.
Mogę jedynie wstawiać fragmenty kodu odpowiedzialne za poszczególne obliczenia.

2

Napisałem kiedyś program do rejestrowania zdarzeń na ekranie.
U mnie problem polegał na tym, że procedura, która ściągała obraz z ekranu nie "widziała" kursora. Obraz był przechwycony, ale kursora na nim nie było.
Problem rozwiązałem za pomocą funkcji SetWindowsHookEx (przechwytywałem zdarzenia myszki i ręcznie dodawałem obraz kursora do pobieranego obrazu). Nie wiem co dokładnie Twój program ma robić, ale może ten trop Ci pomoże.

Jeśli chodzi o przyciski na belce tytułowej okna, to wg mnie nie są to osobne kontrolki (okna), ale może się mylę.

Napisałem program, który wyznacza obszar zajmowany przez konkretny przycisk na podstawie danych otrzymywanych z komunikatu WM_NCHITTEST, ale uzyskane wyniki są co najmniej dziwne.
Program jest do pobrania tu (w C):
https://3n.com.pl/puzzle/testBtn.exe
https://3n.com.pl/puzzle/testBtn.cpp

Na WinXP - program działa prawidłowo (tzn. obszar wyznaczony przy użyciu komunikatu WM_NCHITTEST) odpowiada wymiarom przycisków.
Natomiast na Win10 - wygląda na to, że dla niektórych okien system zwraca w komunikacie WM_NCHITTEST inne wartości, niż wynikałoby to z rozmiarów przycisków.
Przy czym zjawisko ma miejsce tylko dla niektórych okien. Np. dla okna Eksploratora Windows jest ok
Nie wiem czemu tak jest. Jakieś pomysły?

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