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

Posted

技术标签:

【中文标题】运行 Aero 时如何确定实际窗口窗体大小(包含所有非客户端元素)?【英文标题】:How to determine ACTUAL windows form size (with all nonclient elements) when running Aero? 【发布时间】:2012-01-12 16:33:21 【问题描述】:

我正在尝试将我的表单精确定位在任务栏上方。不幸的是,我的表单上的 this.Height 返回的值比实际表单小 10 像素(包括所有边框、标题栏等),这阻碍了我的努力。我正在运行带有 Aero 的 Windows 7。当 Aero 关闭(并且边框更薄)时,一切都按预期工作。表单边框样式为FixedSingle。我不想实施特定于 Aero 的 hack。我该怎么做才能获得正确的高度?

【问题讨论】:

【参考方案1】:

是的,Aero 对 GetWindowRect() 返回的窗口大小撒谎。这是一个相当重要的 appcompat hack,如果没有它,太多程序的客户区会太小。不幸的是,既没有 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 中运行。


更新:现在默认情况下在 VS2012 及更高版本中完成,当您以 .NET 4.5 为目标时

【讨论】:

哎哟!好吧,因为这是我自己使用的一个小实用程序,我想我会忽略它。对于这么小的不精确性,任何其他方式似乎都太麻烦了(除了简单地在我的计算中破解 +10)。

以上是关于运行 Aero 时如何确定实际窗口窗体大小(包含所有非客户端元素)?的主要内容,如果未能解决你的问题,请参考以下文章

在VB6.0中,运行一个窗体时,放大该窗体的尺寸时将触发的事件是

在启用 Aero 的 Windows 7 上运行 .NET 2.0 应用程序窗体应用程序会导致菜单交互使应用程序崩溃

vb中一个窗口中的控件随窗口的大小改变而相应改变位置

MFC如何将窗口中所有控件大小随父窗口大小改变

Qt 如何获取滚动窗体中鼠标点击的坐标

winform窗体运行时的大小和设计时不一致