2017-08-18 55 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