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

时间:2015-07-20 21:01:49

标签: c++ windows winapi hook windows-10

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

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

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

enter image description here

2 个答案:

答案 0 :(得分:5)

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

15秒窗口,带有保持和恢复按钮,是一个#32770对话框。使用OS对话框时,启动过程是explorer.exe。它确实显示在我的spyxx上 - 见下文。只需在对话框显示时点击Windows按钮即可查找。

您可以在没有对话框的情况下更改分辨率。显卡通常有自己的软件,有或没有其他对话。任何软件都可以使用ChangeDisplaySettings更改分辨率。

你可能会追踪操作系统对话框,但这会非常脆弱,所以我不推荐它 如果您确实需要查看系统对话框,则可以在获得WM_DISPLAYCHANGE时枚举所有顶级窗口。
我想你必须连续枚举至少一秒钟,并寻找儿童窗口,字幕,类,窗口位置(主屏幕中心)的模式。根据操作系统版本和每种语言,您必须这样做 您还可以在收到WM_DISPLAYCHANGE之前定期枚举窗口,然后在分辨率更改后查找顶级窗口中的更改。

enter image description here

修改
根据要求,这里有一些代码可以看到对话框:

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

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

答案 1 :(得分:-1)

尝试使用FindWindowEx找到该窗口,带有子窗口或带有该特定文本的主窗口......