获取有关 Windows 10 的“恢复/保留新显示设置”对话框的通知

问题描述 投票:0回答:3

当 Windows 10(甚至以前的版本)中的用户更改显示设置时,操作系统会向他们提供是保留还是恢复更改的选择。还为用户提供了 15 秒的窗口。如果他们什么都不做,那么设置将被恢复。如果他们选择“保留更改”或“恢复”,将采取适当的操作。我希望在显示此对话框时得到操作系统的通知。

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

顺便说一下,我需要在 Windows 10 上实现此功能。因此 Windows 10 信息将是最有帮助的。谢谢!

enter image description here

c++ windows winapi hook windows-10
3个回答
5
投票

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

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


0
投票

我发现此页面正在寻找一种在更改分辨率设置时删除此对话框的方法。这可能吗?


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.