Как определить ФАКТИЧЕСКИЙ размер формы окна (со всеми неклиентскими элементами) при запуске Aero?

Я пытаюсь разместить свою форму точно над панелью задач. К сожалению, моим усилиям препятствует тот факт, что this.Height в моей форме возвращает значение, которое на 10 пикселей меньше фактической формы (со всеми рамками, строкой заголовка и т. д.). У меня Windows 7 с Aero. Когда Aero выключен (и границы тоньше), все работает как положено. Стиль границы формы — FixedSingle. Я не хочу реализовывать хаки, специфичные для Aero. Что я могу сделать, чтобы получить правильную высоту?


person Vilx-    schedule 12.01.2012    source источник


Ответы (1)


Да, Aero врет о размере окна, возвращаемом функцией GetWindowRect(). Это довольно важный хак для совместимости приложений, без него слишком много программ имели бы слишком маленькую клиентскую область. К сожалению, нет ни вызова API, ни записи манифеста, которые можно использовать для отключения лжи. Единственный способ - установить версию Windows в заголовке EXE и пометить ее как совместимую с Vista.

Вы можете сделать это с помощью Editbin.exe в событии после сборки:

set pathsave=%path%
set path=$(devenvdir);$(devenvdir)..\..\vc\bin
editbin.exe /subsystem:windows,6.0 "$(targetfilename)"
set path=%pathsave%

Помните, что после этого ваша программа больше не будет работать в XP.


ОБНОВЛЕНИЕ: теперь это делается по умолчанию в VS2012 и выше, когда вы ориентируетесь на .NET 4.5.

person Hans Passant    schedule 12.01.2012
comment
Ой! Ну, так как это небольшая утилита для моего собственного использования, я думаю, что тогда я просто проигнорирую ее. Любой другой способ кажется слишком хлопотным для такой небольшой неточности (если не считать простого взлома +10 к моим расчетам). - person Vilx-; 13.01.2012