获取有关Windows 10的还原/保留新显示设置对话框的通知

arm*_*ali 8 c++ windows hook winapi windows-10

当Windows 10中的用户(甚至以前的版本更改显示设置)时,操作系统会为操作系统提供是否保留或还原更改的选项.用户还被给予15秒的窗口.如果他们什么都不做,那么设置将被还原.如果他们选择"保留更改"或"还原",将采取适当的措施.我想在显示此对话框时通知操作系统.

我监视了任务管理器中的所有进程,因此没有生成新进程.所以,我甚至无法跟踪这个过程.这样做的可行方法是什么?我知道一种实现方法,听一下WM_DISPLAYCHANGE事件.但这不是一种可靠的方法,因为用户被给予了15秒的窗口.基本上,我想在对话框出现时收到通知并消失.我有什么想法可以实现这个?

顺便提一下,我需要为Windows 10实现这一点.所以Windows 10的信息将是最有帮助的.谢谢!

在此输入图像描述

Bit*_*ler 5

WM_DISPLAYCHANGE是正确的方法.它在分辨率真正发生变化时发送.也就是说,就在对话框出现之前,以及当你点击还原时.如果保持分辨率,则不会发送.

带有保持和恢复按钮的15秒窗口是#32770对话框.使用OS对话框时,启动过程是explorer.exe.它确实显示在我的spyxx上 - 见下文.只需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;
}
Run Code Online (Sandbox Code Playgroud)

这是它的输出:

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
Run Code Online (Sandbox Code Playgroud)

另外需要注意的是 - 如果屏幕分辨率在win10或未来的操作系统中触发UAC,则无法检测到对话框.您仍然会收到有关更改分辨率的通知.
UAC对话框无法检测,因为它在只能由系统帐户访问的桌面中运行.