2017-08-18 54 views
0

我正在写一个替代方案 + 选项卡替换为C#,并且在全屏应用程序中遇到问题。如何检测SetForegroundWindow是否更改屏幕分辨率?

有没有办法检测一个SetForegroundWindow(hWnd)调用是否会改变屏幕分辨率?或者等价地,如果hWnd是全屏应用程序?我想等到决议更改完成后,或者如果没有更改,请立即进行。

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

如果有人有兴趣,我的申请来源是https://bitbucket.org/FrigoCoder/frigotab/src。为了澄清,如果发生分辨率变化而不是稍后检测到,我会事先知道更多的兴趣。我已经知道了一种半解决方案,我在GetDesktopWindow()或其他窗口和手表SystemEvents.DisplaySettingsChangingDisplaySettingsChanged上拨打SetForegroundWindow()。但是,如果发生分辨率更改,这只会给我一个延迟的异步通知,并且不会告诉我它是否不会。

+0

您正试图解决错误的问题。只需在一个地方处理分辨率变化,一切都会好起来的。当分辨率发生变化时,只需重新绘制UI即可。不需要任何黑客。 – IInspectable

回答

1

我设法解决了这个问题。而不是试图检测全屏应用程序,我只需发送灭活消息前台应用程序,这将触发一个早期的分辨率变化:

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

此完全相同的消息在应用交换机还送出,所以之前我基本上是模仿一个它确实发生。我还没有遇到任何副作用。

但是,请注意,这不是而是解决DWM问题。 Windows 7会自动禁用DWM组合以实现兼容性启动,或者当它检测到直接访问主显示界面时。它不允许您重新启用,并且我看不到这个问题的简单解决方案。谢天谢地,这个问题最终会消失,因为在Windows 8和更新版本中总是启用DWM组合。

0

也许Winforms事件SizeChanged可以帮助你。

您可以将此事件用作其余代码的延续。如果由于没有调整大小而导致事件未触发,则可以在指定的超时后执行次要继续。这并不完美,但可能会满足您的需求。

+0

我认为OP想知道分辨率*是否会改变,**之前**他实际上执行了alt +标签 – Rafalon

+0

为我的问题增加了一些细节。基本上是的,我想事先知道最好的结果。我后来已经有了一种原始的方式来检测分辨率变化,但是并没有立即给出答案,并且如果没有更改分辨率,根本不会给我答案。 – Frigo