WM_DISPLAYCHANGE jest poprawny sposób. Jest wysyłany, gdy rozdzielczość naprawdę się zmienia. Oznacza to, że tuż przed wyświetleniem okna dialogowego i po kliknięciu przycisku Przywróć. Nie zostanie wysłany, jeśli zachowasz rozdzielczość.
15-sekundowe okno z przyciskami Zachowaj i Przywróć jest oknem dialogowym # 32770. Podczas korzystania z okna systemu operacyjnego proces uruchamiania to explorer.exe. Pokazuje się na moim spyxx - patrz poniżej. Po prostu naciśnij przycisk Windows
, gdy pojawi się okno dialogowe i poszukaj go.
Możesz zmienić rozdzielczość bez okna dialogowego. Karty graficzne zwykle mają własne oprogramowanie z innym oknem dialogowym lub bez niego. Każde oprogramowanie może zmienić rozdzielczość za pomocą ChangeDisplaySettings.
Prawdopodobnie można wyśledzić okno systemu operacyjnego, ale byłoby to bardzo delikatne, więc nie polecam go.
Jeśli naprawdę potrzebujesz zobaczyć okno dialogowe systemu, możesz wyzerować wszystkie okna najwyższego poziomu, gdy otrzymasz WM_DISPLAYCHANGE.
Sądzę, że musiałbyś wyliczać w sposób ciągły przez co najmniej sekundę i szukać wzorca okien potomnych, podpisów, klas, pozycji okna (środek ekranu podstawowego). Musiałbyś to zrobić w przypadku wersji systemu operacyjnego i języka.
Możesz także wyodrębniać okna okresowo, zanim otrzymasz WM_DISPLAYCHANGE, a następnie po zmianie rozdzielczości szukać zmian w oknach najwyższego poziomu.
EDIT:
Zgodnie z wnioskiem, tu jest jakiś kod, aby zobaczyć okno:
std::map<std::string,int> windows;
BOOL CALLBACK onEnumWindow(HWND hwnd, LPARAM lParam)
{
char buf[500];
if(IsWindowVisible(hwnd) && GetWindowText(hwnd,buf,500) > 0)
windows[buf]++;
return TRUE;
}
std::string getLayout()
{
std::string layout;
EnumWindows(onEnumWindow, 0);
for(auto& w : windows) {
if(w.first == "Display Settings") layout += "**** ";
layout += std::to_string(w.second) + "x " + w.first + "\n";
}
windows.clear();
return layout;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::string layout0;
for(;;) {
std::string layout = getLayout();
if(layout != layout0) { // <-- you should test that across res change
printf("%s\n", layout.c_str());
layout0 = layout;
}
}
return 0;
}
I tu jest to wyjście:
1x C:\Users\yakov\Documents\Visual Studio 2013\Projects\desk\x64\Release\desk.exe
1x EnumWindows function (Windows) - Google Chrome
1x Program Manager
1x Screen Resolution
1x Start
1x desk (Running) - Microsoft Visual Studio
1x C:\Users\yakov\Documents\Visual Studio 2013\Projects\desk\x64\Release\desk.exe
**** 1x Display Settings
1x EnumWindows function (Windows) - Google Chrome
1x Program Manager
1x Screen Resolution
1x Start
1x desk (Running) - Microsoft Visual Studio
1x C:\Users\yakov\Documents\Visual Studio 2013\Projects\desk\x64\Release\desk.exe
1x EnumWindows function (Windows) - Google Chrome
1x Program Manager
1x Screen Resolution
1x Start
1x desk (Running) - Microsoft Visual Studio
Inną rzeczą, aby pamiętać - jeśli rozdzielczość ekranu wyzwala UAC w win10 lub w przyszłych systemach operacyjnych, nie można tego zrobić wykryj okno dialogowe. Nadal otrzymujesz powiadomienie o zmianie rozdzielczości.
Okno dialogowe Kontrola konta użytkownika nie jest wykrywalne, ponieważ działa na pulpicie dostępnym tylko dla konta systemowego.
Uważam, że to okno dialogowe jest tworzone na osobnym pulpicie. Nie sądzę, że nawet używanie haków systemowych pomoże tutaj, ponieważ są one ograniczone do tego samego pulpitu ... – defube
@defube, nie sądzę, ponieważ sposób w jaki jest wyświetlany jest taki, jakby był wyświetlany w tym konkretnym oknie . Kiedy okno Ustawienia wyświetlania nie jest zmaksymalizowane (tak jak nie jest to na zrzucie ekranu, które podałem), to okno dialogowe rozciąga się tylko na to okno. Mam tylko jedno biurko. Co sprawia, że myślisz, że pochodzi z innego komputera? – armanali
W takim przypadku może to być tylko część sposobu renderowania okna dialogowego (nie mam 10 pod ręką, aby zweryfikować w tej chwili). Byłoby to dziwne, gdyby Microsoft się zmienił, i pod tym względem jestem ciekaw, dlaczego tak jest ... – defube