W Windows XP i powyżej, biorąc pod uwagę uchwyt okna (HWND), jak mogę stwierdzić, czy pozycja okna i rozmiar pozostawia nieodwracalnie okno poza ekranem? Na przykład, jeśli pasek tytułu jest dostępny dla kursora, wówczas okno można przeciągnąć z powrotem na ekran. Muszę sprawdzić, czy okno jest w rzeczywistości widoczne lub co najmniej dostępne dla użytkownika. Sądzę, że muszę wiedzieć, jak wykrywać i reagować na zmiany rozdzielczości i jak radzić sobie z wieloma monitorami. Wydaje się to dość dużą sprawą. Używam C++ i zwykłego SDK, więc ogranicz swoje odpowiedzi do tej platformy, zamiast wywoływać C# lub podobne.Jak określić, czy okno jest poza ekranem?
Odpowiedz
System Windows sprawia, że określenie obszaru roboczego użytkownika na głównym monitorze jest stosunkowo proste (tzn. Obszar ekranu nie jest zasłonięty przez pasek zadań). Zadzwoń pod SystemParametersInfo
function i podaj flagę pierwszego parametru(). Parametr pvParam
powinien wskazywać wartość RECT
structure, która będzie otrzymywać współrzędne obszaru roboczego we współrzędnych ekranu wirtualnego.
Po uzyskaniu współrzędnych opisujących obszar roboczy, wystarczy porównać je z bieżącą pozycją okna aplikacji, aby ustalić, czy leży ona w tych granicach.
Chęć obsługi wielu monitorów nieco komplikuje sprawę. Dokumentacja dla SystemParametersInfo
sugeruje, że musisz zadzwonić pod numer GetMonitorInfo
function, aby uzyskać obszar roboczy monitora innego niż główny. Wypełnia on strukturę o nazwie MONITORINFOEX
, która zawiera element rcWork
, który definiuje obszar roboczy tego monitora, ponownie wyrażony we współrzędnych ekranu wirtualnego jako struktura RECT
.
Aby to zrobić, musisz wyliczyć wszystkie monitory, które użytkownik podłączył do systemu i pobrać obszar roboczy każdego z nich za pomocą GetMonitorInfo
.
Istnieje kilka próbek tego można znaleźć w całym internecie:
- MSDN ma jakiś przykładowy kod Positioning Objects on a Multiple Display Setup.
- Jeśli używasz MFC, oto, co wygląda na an excellent example obsługi wielu monitorów.
- Nawet jeśli nie używasz MFC, ten artykuł odnosi się do the following link, co wygląda na prawdziwy klejnot, jeśli chodzi o wyjaśnienie, w jaki sposób obsługa wielu monitorów działa w systemie Windows, nawet jeśli jest to trochę stara szkoła. Podoba się lub nie, bardzo niewiele z tego zmieniło się w późniejszych wersjach systemu Windows.
Wreszcie, wspomniano chcąc wykryć zmiany rozdzielczości. Jest to o wiele prostsze, niż pewnie sobie wyobrażałeś. Jak wiesz, jeśli wykonałeś jakieś programowanie w systemie Windows, podstawowym sposobem, w jaki system operacyjny komunikuje się z twoją aplikacją, jest wysyłanie wiadomości na numer WindowProc
function.
W takim przypadku należy zwrócić uwagę na numer WM_DISPLAYCHANGE
message, który jest wysyłany do wszystkich okien po zmianie rozdzielczości ekranu. wParam
zawiera nową głębię obrazu w bitach na piksel; słowo niższego rzędu z lParam
określa rozdzielczość poziomą, a słowo wyższego rzędu z lParam
określa pionową rozdzielczość ekranu.
Kontrola widoczności jest naprawdę łatwa.
RECT rtDesktop, rtView;
GetWindowRect(GetDesktopWindow(), &rtDesktop);
GetWindowRect(m_hWnd, &rtView);
HRGN rgn = CreateRectRgn(rtDesktop.left, rtDesktop.top, rtDesktop.right, rtDesktop.bottom);
BOOL viewIsVisible = RectInRegion(rgn, &rtView);
DeleteObject(rgn);
Nie musisz używać RectInRegion, użyłem do skrócenia kodu.
Wyświetlanie, monitorowanie zmiany rozdzielczości jest również łatwe, jeśli obsługujesz wiadomość WM_SETTINGCHANGE.
http://msdn.microsoft.com/en-us/library/ms725497(v=vs.85).aspx
UPDATE
Jak zauważył @Cody Szary, myślę WM_DISPLAYCHANGE jest bardziej odpowiednie niż WM_SETTINGCHANGE. Ale biblioteka MFC 9.0 korzysta z WM_SETTINGCHANGE.
- 1. Jak sprawdzić, czy element jest poza ekranem?
- 2. Określanie, czy formularz jest całkowicie poza ekranem
- 3. Okno programu Visual Studio Zamrażanie/TFS Może być poza ekranem
- 4. Android OpenGL FBO poza ekranem
- 5. OpenGL: Szybkie renderowanie poza ekranem
- 6. Jak zapobiec rysowaniu komponentu XNA, gdy jest poza ekranem?
- 7. Tworzenie wieloplatformowego kontekstu OpenGL poza ekranem
- 8. użycie JavaScript wymienić na tekście poza ekranem
- 9. Zapobieganie wyświetlaniu widoków obrazu poza ekranem
- 10. flexbox | element flex jest wypychany z zawierającego div (poza ekranem)
- 11. CoordinatorLayout/AppBarLayout ExpandableListWyjście renderowane poza ekranem
- 12. Jak określić, czy typ jest klasą statyczną?
- 13. Czy jest kara pieniężna za "ukrywanie" przedmiotów poza ekranem za śmieszne kwoty?
- 14. R ggplot2 - Jak określić kolor poza granicami
- 15. Przewijanie w Emacsie bez poruszania się, nawet jeśli poza ekranem
- 16. Jak określić, gdzie otwiera się okno Tkinter?
- 17. Przesuwanie elementu div poza ekranem przy użyciu jQuery
- 18. Rysowanie bufora renderowania poza ekranem w OpenGL ES (iPhone)
- 19. Wykonaj renderowanie poza ekranem (openGL) za pomocą Qt5
- 20. Jak określić, czy wielościan jest wypukły?
- 21. Kliknij poza niemodalne okno dialogowe, aby zamknąć
- 22. Sprawdź, czy jest to obiekt okno
- 23. Jak określić, czy encja EF4 jest nowa, czy istniejący rekord?
- 24. Czy GObject jest używany poza GNOME?
- 25. W WinRT C# jak zapisać drzewo XAML poza ekranem przy użyciu RenderTargetBitmap?
- 26. Jak przesuwać elementy div z poza ekranem do układu absolutnego za pomocą przejść CSS?
- 27. Programowo określić, czy inicjowany jest Git-Flow
- 28. Sprawdź, czy okno jest na bieżącym pulpicie?
- 29. Jak przewinąć ekran podczas przeciągania elementów z przewijanych/sortowanych do innych, poza ekranem?
- 30. Jak sprawdzić, czy kursor myszy znajduje się nad ekranem komputera?
Dzięki, to doskonały początek - nie mogę uwierzyć, że wcześniej nie natknąłem się na SystemParametersInfo. Nadal mam problem z tym, czy pasek tytułu jest widoczny i co się stanie, jeśli rozdzielczość się zmieni. – hatcat
@hatcat: Nie ma powodu się bić; Windows API jest duży i nikt nie wie wszystkiego. Nie jestem pewien, jak można jeszcze utknąć na widoczności paska tytułu. Sprawdź, czy region okna zawierającego pasek tytułu znajduje się w obszarze roboczym ekranu, z którego korzystasz z którejś z funkcji opisanych powyżej. I nagle zapomniałem o wykrywaniu zmian rozdzielczości; Zaktualizuję moją odpowiedź. –
Dziękujemy! Programowałem system Windows od 1992 roku, wierz lub nie. Myślę, że najtrudniej jest wiedzieć, jaka funkcjonalność została zastąpiona, kiedy i czy należy trzymać się tego, co wiesz. Część paska tytułu miała większy związek z odzyskiwaniem tego regionu, więc mogłem go przetestować. Po prostu sprawdzę dziesięć najlepszych pikseli i dziesięć bocznych pikseli, które powinny wystarczyć. – hatcat