2015-07-20 24 views
8

Gdy użytkownik w systemie Windows 10 (lub nawet poprzednie wersje zmienia ustawienia wyświetlania), oferuje systemowi wybór, czy zachować, czy przywrócić zmiany. Użytkownik otrzymuje także 15-sekundowe okno. Jeśli nic nie zrobią, ustawienia zostaną przywrócone. Jeśli wybierze "Zachowaj zmiany" lub "Przywróć", zostanie podjęte odpowiednie działanie. Chcę otrzymywać powiadomienia przez system operacyjny, gdy wyświetlane jest to okno dialogowe.Otrzymuj powiadomienia o oknie dialogowym Przywróć/Zachowaj nowe okno systemu Windows 10

Monitorowałem wszystkie procesy w Menedżerze zadań i nie pojawił się nowy proces w wyniku. Nie mogę nawet śledzić procesu. Jaki jest możliwy sposób na zrobienie tego? Znam jeden sposób na wdrożenie, słuchanie wydarzenia WM_DISPLAYCHANGE. Ale nie jest to niezawodna metoda z powodu 15-sekundowego okna, które użytkownik podaje. Zasadniczo chcę otrzymywać powiadomienia, gdy okno dialogowe pojawia się i znika. Jakieś pomysły, jak mogę to wdrożyć?

Muszę to zaimplementować dla systemu Windows 10 przy okazji. Dlatego najbardziej pomocne będą informacje z Windows 10. Dziękuję Ci!

enter image description here

+0

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

+0

@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

+0

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

Odpowiedz

5

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.

enter image description here

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.

+0

, czy myślisz, że możesz dodać fragment kodu z tego, co właśnie skomentowałeś? To będzie naprawdę pomocne. Jeśli nie możesz, nadal jest OK, ale zrób to, jeśli już to masz. – armanali

-1

Spróbuj znaleźć to okno przy użyciu FindWindowEx, z okna potomnego lub okna głównego z tego konkretnego tekstu ...

+0

Próbowałem znaleźć, że okna za pomocą Spy ++ (zarówno wersje x86 i x64 programu), ale nie udało się. Czy możesz dokładniej określić, w jaki sposób mogę to zrobić? – armanali

+0

Prawdopodobnie jest wyświetlany w innej sesji/na pulpicie, podobnie jak w oknie dialogowym UAC. W żaden sposób nie będziesz mieć do niego dostępu. –

+0

Wygląda na to, że szukam tego okna wiadomości, jeśli motyw aero jest wyłączony, próbowałem go w vmware. Nie mam teraz Windowsa, żeby przetestować go w środowisku z włączonym aero. –