Как определить, что SetForegroundWindow изменяет разрешение экрана?

Я пишу замену Alt+Tab в C#, и у меня проблемы с полноэкранными приложениями.

Есть ли способ обнаружить, если SetForegroundWindow(hWnd) Звонок собирается изменить разрешение экрана? Или эквивалентно, если hWnd такое полноэкранное приложение? Я хотел бы подождать, пока изменение разрешения не будет сделано, или, если нет изменений, приступить немедленно.

Изменение разрешения экрана выполняется асинхронно, вызов функции возвращается задолго до того, как это произошло, поэтому мой код запускается преждевременно и рисует мое приложение на поверхности полноэкранного приложения с неправильными размерами, тогда после изменения разрешения это выглядит особенно некрасиво.

Источник моего приложения на https://bitbucket.org/FrigoCoder/frigotab/src если кто-то заинтересован.

Чтобы уточнить, мне было бы больше интересно узнать заранее, если произойдет изменение разрешения, чем обнаружить его позже. Я уже знаю половину решения, где я звоню SetForegroundWindow() на GetDesktopWindow() или какое-то другое окно и часы SystemEvents.DisplaySettingsChanging а также DisplaySettingsChanged, Это, однако, только дает мне позднее асинхронное уведомление, если изменение разрешения происходит, и не говорит мне, если это не так.

2 ответа

Решение

Мне удалось решить проблему. Вместо того, чтобы пытаться обнаружить полноэкранные приложения, я просто отправляю сообщение об инактивации в приложение переднего плана, которое вызывает раннее изменение разрешения:

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

Точно такое же сообщение также отправляется во время переключения приложений, поэтому я, по сути, эмулирую его до того, как оно произойдет. Я не сталкивался с какими-либо побочными эффектами.

Имейте в виду, однако, что это не решает проблемы DWM. Windows 7 автоматически отключает композицию DWM для запуска совместимости или при обнаружении прямого доступа к основной поверхности дисплея. Это не позволяет вам повторно включить, и я не вижу простого решения этой проблемы. К счастью, эта проблема со временем исчезнет, ​​так как состав DWM всегда включен в Windows 8 и новее.

Возможно, событие Winforms SizeChanged может вам помочь.

Вы можете использовать это событие в качестве продолжения своего рода для остальной части вашего кода. В случае, если событие не сработало из-за отсутствия изменения размера, у вас может быть вторичное продолжение, которое будет запущено после указанного времени ожидания. Это не идеально, но может удовлетворить ваши потребности.

Другие вопросы по тегам