当Windows 10中的用户(甚至以前的版本更改显示设置)时,操作系统会向他们提供是否保留或还原更改的选项。用户还被给予15秒的窗口。如果他们什么都不做,那么设置将被还原。如果他们选择" Keep Changes"或"还原",将采取适当的措施。我想在显示此对话框时通知操作系统。
我监视了任务管理器中的所有进程,因此没有生成新进程。所以,我甚至无法跟踪这个过程。这样做的可行方法是什么?我知道一种实现方法,听一下WM_DISPLAYCHANGE事件。但这不是一种可靠的方法,因为用户被给予了15秒的窗口。基本上,我想在对话框出现时收到通知并消失。我有什么想法可以实现这个吗?
顺便说一句,我需要为Windows 10实现这一点。所以Windows 10的信息将是最有帮助的。谢谢!
答案 0 :(得分: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;
}
这是它的输出:
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找到该窗口,带有子窗口或带有该特定文本的主窗口......