如何检测 SetForegroundWindow 是否更改了屏幕分辨率?
How to detect if SetForegroundWindow changes screen resolution?
我正在用 C# 编写 Alt+Tab 替换,在全屏应用程序中遇到问题。
有没有办法检测 SetForegroundWindow(hWnd)
调用是否会改变屏幕分辨率?或者等价地,如果 hWnd
是全屏应用程序?我想等到分辨率更改完成,或者如果没有更改,请立即进行。
屏幕分辨率更改是异步完成的,函数调用 returns 早于它发生,所以我的代码过早运行,并将我的应用程序绘制到全屏应用程序的表面上,尺寸错误,然后分辨率变了,特别难看
如果有人感兴趣,我的申请来源在 https://bitbucket.org/FrigoCoder/frigotab/src。
为了澄清,我更感兴趣的是事先知道分辨率是否发生变化,而不是稍后检测它。我已经知道一个半解决方案,我在 GetDesktopWindow()
或其他一些 window 上调用 SetForegroundWindow()
并观察 SystemEvents.DisplaySettingsChanging
和 DisplaySettingsChanged
。但是,如果发生分辨率更改,这只会给我一个延迟的异步通知,如果没有更改则不会告诉我。
也许 Winforms 活动 SizeChanged 可以帮助您。
您可以将此事件用作其余代码的延续。如果事件因未调整大小而未触发,您可以进行二次延续,在指定的超时后 运行。它并不完美,但可以满足您的需求。
我设法解决了这个问题。我没有尝试检测全屏应用程序,而是简单地向前台应用程序发送了一条停用消息,这会触发早期分辨率更改:
SendMessage(GetForegroundWindow(), WM_ACTIVATEAPP, false, GetCurrentThreadId());
在应用程序切换期间也会发送完全相同的消息,因此我基本上是在它实际发生之前模拟了一个消息。我还没有遇到任何副作用。
但是请注意,这不会解决 DWM 问题。 Windows 7 会自动禁用 DWM 组合以进行兼容性启动,或者当它检测到对主显示表面的直接访问时。它不允许您重新启用,而且我没有看到解决此问题的简单方法。值得庆幸的是,这个问题最终会消失,因为 DWM 组合在 Windows 8 和更新版本中始终启用。
我正在用 C# 编写 Alt+Tab 替换,在全屏应用程序中遇到问题。
有没有办法检测 SetForegroundWindow(hWnd)
调用是否会改变屏幕分辨率?或者等价地,如果 hWnd
是全屏应用程序?我想等到分辨率更改完成,或者如果没有更改,请立即进行。
屏幕分辨率更改是异步完成的,函数调用 returns 早于它发生,所以我的代码过早运行,并将我的应用程序绘制到全屏应用程序的表面上,尺寸错误,然后分辨率变了,特别难看
如果有人感兴趣,我的申请来源在 https://bitbucket.org/FrigoCoder/frigotab/src。
为了澄清,我更感兴趣的是事先知道分辨率是否发生变化,而不是稍后检测它。我已经知道一个半解决方案,我在 GetDesktopWindow()
或其他一些 window 上调用 SetForegroundWindow()
并观察 SystemEvents.DisplaySettingsChanging
和 DisplaySettingsChanged
。但是,如果发生分辨率更改,这只会给我一个延迟的异步通知,如果没有更改则不会告诉我。
也许 Winforms 活动 SizeChanged 可以帮助您。
您可以将此事件用作其余代码的延续。如果事件因未调整大小而未触发,您可以进行二次延续,在指定的超时后 运行。它并不完美,但可以满足您的需求。
我设法解决了这个问题。我没有尝试检测全屏应用程序,而是简单地向前台应用程序发送了一条停用消息,这会触发早期分辨率更改:
SendMessage(GetForegroundWindow(), WM_ACTIVATEAPP, false, GetCurrentThreadId());
在应用程序切换期间也会发送完全相同的消息,因此我基本上是在它实际发生之前模拟了一个消息。我还没有遇到任何副作用。
但是请注意,这不会解决 DWM 问题。 Windows 7 会自动禁用 DWM 组合以进行兼容性启动,或者当它检测到对主显示表面的直接访问时。它不允许您重新启用,而且我没有看到解决此问题的简单方法。值得庆幸的是,这个问题最终会消失,因为 DWM 组合在 Windows 8 和更新版本中始终启用。