【发布时间】:2008-09-26 00:00:25
【问题描述】:
我的应用程序绘制了它自己的所有窗口边框和装饰。它适用于设置为自动隐藏的 Windows 任务栏,除非我的应用程序窗口最大化。任务栏不会“卷起”。如果我没有最大化应用程序,它会正常运行,即使大小一直到屏幕底部也是如此。如果我只是调整窗口大小以占据整个显示器(就好像它已最大化),它甚至可以正常工作。
【问题讨论】:
我的应用程序绘制了它自己的所有窗口边框和装饰。它适用于设置为自动隐藏的 Windows 任务栏,除非我的应用程序窗口最大化。任务栏不会“卷起”。如果我没有最大化应用程序,它会正常运行,即使大小一直到屏幕底部也是如此。如果我只是调整窗口大小以占据整个显示器(就好像它已最大化),它甚至可以正常工作。
【问题讨论】:
我发现了问题。我的应用程序正在处理 WM_GETMINMAXINFO 消息,并覆盖参数 MINMAXINFO 记录中的值。记录中的值按屏幕像素分辨率增加了 7(边框宽度)。这是有道理的,因为当最大化时,它会将窗口的边框推到屏幕的可见部分之外。它还将 ptMaxPosition(最大化时窗口原点设置的点)设置为 -7、-7。我的应用程序将其设置为 0,0,并将最大高度和宽度设置为屏幕分辨率大小(未膨胀)。不知道为什么这样做;是前任写的。如果我注释掉该代码并且不修改 MINMAXINFO 结构,则自动隐藏有效。
至于为什么,我不完全确定。弹出“自动隐藏”任务栏的检测可能与处理 WM_MOUSEMOVE 消息的机制挂钩,而不是 WM_NCMOUSEMOVE。由于我的应用程序导致最大化将我的边框停在屏幕底部,我本来会生成 WM_NCMOUSEMOVE 事件;如果不考虑 MINMAXINFO,我会一直生成 WM_MOUSEMOVE。
【讨论】:
WS_EX_TOPMOST 被删除了。一种可能的解决方案是:将基类 CFrameWndEx 改回 CFrameWnd(如果您不使用 Ribbon 或其他 Adv. 功能)。
这取决于是否在任务栏属性上选中了“将任务栏保持在其他窗口之上”。如果选中,则会出现任务栏。
但不要试图以编程方式更改最终用户计算机上的此设置以满足您的需求,这被认为是粗鲁和不好的做法。您的应用应适合部署到的任何环境。
【讨论】: