0

我正在用 C# 编写Alt+Tab替换,并且在使用全屏应用程序时遇到问题。

有没有办法检测SetForegroundWindow(hWnd)来电是否会改变屏幕分辨率?或者等效地,如果hWnd是全屏应用程序?我想等到解决方案更改完成,或者如果没有更改,请立即进行。

屏幕分辨率更改是异步完成的,函数调用在它发生之前就返回了,所以我的代码过早地运行,并将我的应用程序绘制到全屏应用程序的表面上,尺寸错误,然后在分辨率更改后,它看起来特别难看。

如果有人感兴趣,我的应用程序的来源是https://bitbucket.org/FrigoCoder/frigotab/src 。

为了澄清,我更感兴趣的是事先知道是否发生了分辨率变化,而不是稍后检测它。我已经知道了一个半解决方案,我SetForegroundWindow()在其中调用GetDesktopWindow()或其他一些窗口并观看SystemEvents.DisplaySettingsChangingDisplaySettingsChanged. 但是,如果发生分辨率更改,这只会给我一个延迟的异步通知,并且不会告诉我是否没有。

4

2 回答 2

2

我设法解决了这个问题。我没有尝试检测全屏应用程序,而是简单地将停用消息发送到前台应用程序,这会触发早期分辨率更改:

SendMessage(GetForegroundWindow(), WM_ACTIVATEAPP, false, GetCurrentThreadId());

在应用程序切换期间也会发送完全相同的消息,所以我基本上在它实际发生之前模拟一个。我还没有遇到任何副作用。

但是请注意,这并不能解决DWM 问题。Windows 7 自动禁用 DWM 组合以进行兼容性启动,或者当它检测到对主显示表面的直接访问时。它不允许您重新启用,而且我没有看到解决此问题的简单方法。值得庆幸的是,这个问题最终会消失,因为 DWM 组合始终在 Windows 8 和更高版本中启用。

于 2017-09-10T09:58:54.267 回答
0

也许 Winforms Event SizeChanged可以帮助你。

您可以将此事件用作其余代码的各种延续。如果由于没有调整大小而没有触发事件,您可能会有一个辅助延续,它将在指定的超时后运行。它并不完美,但可以满足您的需求。

于 2017-08-18T14:23:20.010 回答