如何在运行Aero时确定实际的Windows窗体大小(包括所有非客户端元素)?

6

我想精确地将我的表单定位在任务栏上方。不幸的是,我的表单this.Height返回的值比实际表单(带有所有边框、标题栏等)小10像素。我正在运行带有Aero的Windows 7。当关闭Aero时(边框更薄),一切正常。表单边框样式为FixedSingle。我不想实现Aero特定的黑客技巧。我该怎么做才能得到正确的高度?

1个回答

9

是的,Aero在GetWindowRect()返回的窗口大小上撒了谎。这是一个非常重要的应用兼容性技巧,如果没有它,太多的程序将会有一个过小的客户区域。不幸的是,没有API调用或清单条目可以用来关闭这个谎言。唯一的方法是在EXE头中设置Windows版本并标记为Vista兼容。

你可以在后期构建事件中使用Editbin.exe来实现:

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

请注意,完成此操作后,您的程序将无法在XP上运行。


更新:当您针对.NET 4.5进行目标设置时,默认情况下在VS2012及更高版本中已完成此操作。


1
哎呀!既然这只是我自己使用的小工具,那我就忽略它吧。为了这么小的不精确度而采取其他方式似乎太麻烦了(除非是直接在我的计算中加上+10)。 - Vilx-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接