防止 Windows 中函数调用之间的系统更改

Guarding against system changes between function calls in Windows

给定一些这样的代码...

auto res = GetScreenResolution();

// Can windows change the screen resolution between these calls? 
// How do you guard against it?

DoSomething(res);

可以在函数调用之间更改屏幕分辨率吗?从用户调整显示设置说起。我认为可以,但我会要求确定性。

如果分辨率在调用之间发生变化,那么函数 DoSomething 可能无法正常工作,或者根据代码导致严重问题。

有什么方法可以确保在一段代码的执行过程中系统(或特定设置)不会被更改?

相同的概念可以应用于各种事物,例如检查网络是否正常运行或检查文件的状态。

事情发生的概率很小,不值得计较,但我很好奇。

一些一夜之间的想法...

  1. 在 DoSomething() 之后再次调用 GetScreenResolution() 以检查是否匹配。这也将允许您撤消所做的更改并更正它们。还是有可能出现问题,但是概率要低得多。

  2. 除例外情况外,DoSomething() 可能 抛出数据过期的软件异常。然后你可以做任何必要的事情。

  3. 如果您必须在 GetScreenResolution 和 DoSomething 之间进行大量处理,请稍等片刻,然后可能值得检查系统的更改。如果您收到分辨率已更改的消息,如果架构允许,您也可以重置处理。

您只需要为失败做好准备and/or确保您收到有关任何更改的通知。

即使您可以使用锁来防止另一个应用程序更改显示设置,您也无法阻止我拔出我的显示器电缆并且 Windows 对此做出反应并使我的笔记本电脑屏幕为主显示器。

例如,如果您查看 ChangeDisplaySettings,您将在 MSDN 上看到:

When the display mode is changed dynamically, the WM_DISPLAYCHANGE message is sent to all running applications with the following message parameters.

你唯一能做的就是使用 job object to restrict a specific process/processes under your control from calling certain functions (JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 等等)。