Получите уведомление о возвращении / сохранении новых настроек экрана в Windows 10

Когда пользователь в Windows 10 (или даже в предыдущих версиях изменяет настройки экрана), ОС предлагает ему выбор: сохранить или отменить изменения. Пользователю также предоставляется 15 секундное окно. Если они ничего не делают, то настройки будут отменены. Если они выберут "Сохранить изменения" или "Отменить", будут предприняты соответствующие действия. Я хочу получать уведомления от ОС, когда отображается это диалоговое окно.

Я контролировал все процессы в диспетчере задач, и в результате не было создано ни одного нового процесса. Так что я даже не могу отследить процесс. Каков возможный способ сделать это? Я знаю один способ реализации, слушать событие WM_DISPLAYCHANGE. Но это ненадежный метод из-за 15-секундного окна, которое предоставляется пользователю. По сути, я хочу получать уведомления, когда диалоговое окно появляется и исчезает. Есть идеи, как я могу это реализовать?

Мне нужно, чтобы это было реализовано для Windows 10, кстати. Таким образом, информация Windows 10 будет наиболее полезной. Спасибо!

введите описание изображения здесь

2 ответа

Решение

WM_DISPLAYCHANGE - правильный путь. Отправляется, когда разрешение действительно меняется. То есть, прямо перед тем, как появится диалоговое окно, и когда вы нажмете, вернитесь. Не отправляется, если вы сохраняете разрешение.

15-секундное окно с кнопками сохранения и возврата - это диалог #32770. При использовании диалогового окна ОС процесс запуска представляет собой explorer.exe. Это действительно показывает на моем шпионе - см. Ниже. Просто нажмите Windows кнопку, когда диалоговое окно отображается и искать его.

Вы можете изменить разрешение без диалога. Графические карты обычно имеют свое собственное программное обеспечение с или без какого-либо другого диалога. Любое программное обеспечение может изменить разрешение с помощью ChangeDisplaySettings.

Вы, вероятно, можете отследить диалог ОС, но это будет очень хрупким, поэтому я бы не рекомендовал его.
Если вам действительно нужно увидеть системный диалог, вы можете перечислить все окна верхнего уровня, когда получите WM_DISPLAYCHANGE.
Я предполагаю, что вам придется перечислять непрерывно, по крайней мере, секунду, и искать этот шаблон дочерних окон, подписей, классов, положения окна (центр основного экрана). Вы должны сделать это для каждой версии ОС и для каждого языка.
Вы также можете периодически перечислять окна, прежде чем получите WM_DISPLAYCHANGE, а затем искать изменения в окнах верхнего уровня после изменения разрешения.

РЕДАКТИРОВАТЬ:
Как и требовалось, вот некоторый код для просмотра диалога:

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;
}

И вот это вывод:

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

Еще одна вещь, на которую следует обратить внимание - если разрешение экрана вызывает UAC в win10 или будущих ОС, вы не можете обнаружить диалоговое окно. Вы все еще уведомлены об изменении разрешения.
Диалог UAC не обнаруживается, поскольку он запускается на рабочем столе, который доступен только системной учетной записи.

Попробуйте найти это окно, используя FindWindowEx, с дочерним окном или главным окном с этим конкретным текстом...

Другие вопросы по тегам