首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通知Windows 10的恢复/保存新显示设置对话框

通知Windows 10的恢复/保存新显示设置对话框
EN

Stack Overflow用户
提问于 2015-07-20 21:01:49
回答 2查看 1.1K关注 0票数 8

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

我监视了任务管理器中的所有进程,因此没有产生新的进程。所以,我甚至无法追踪这个过程。有什么可能做到这一点呢?我知道一种实现方法,听WM_DISPLAYCHANGE事件。但这不是一个可靠的方法,因为给用户15秒窗口。基本上,当对话框出现并消失时,我希望得到通知。我有什么办法来实现这个吗?

顺便说一下,我需要在Windows 10上实现这一点。所以Windows 10的信息将是最有用的。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-01 01:00:47

WM_DISPLAYCHANGE是正确的方法。它是在决议真正改变的时候发送的。也就是说,就在对话框出现之前,当您单击revert时。如果你遵守决议,它就不会发送。

第15秒窗口,有保留和还原按钮,是一个#32770对话框。当您使用OS对话框时,启动过程是explorer.exe。它确实显示在我的间谍-见下文。当对话框显示并查找时,只需单击Windows按钮即可。

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

您可能可以跟踪OS对话框,但这将是非常脆弱的,所以我不推荐它。

如果您确实需要查看系统对话框,则可以在获得WM_DISPLAYCHANGE时启用所有顶级窗口。

我想您至少需要持续一秒钟,并查找子窗口、标题、类、窗口位置(主屏幕中心)的模式。您必须按照操作系统版本和语言执行此操作。

还可以在接收WM_DISPLAYCHANGE之前定期启用窗口,然后在分辨率更改后查找顶层窗口中的更改。

编辑:

按照要求,下面是查看对话框的一些代码:

代码语言:javascript
运行
复制
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;
}

这是输出:

代码语言:javascript
运行
复制
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,或者将来的OSs,则无法检测到对话框。决议的改变还在通知你。

UAC对话框无法检测到,因为它运行在只能由系统帐户访问的桌面上。

票数 5
EN

Stack Overflow用户

发布于 2015-07-29 13:26:28

尝试使用FindWindowEx查找该窗口,其中包含一个子窗口或主窗口,其中包含该特定文本.

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31526311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档