我收到了来自上级的一个有趣的请求。他们想要一个简单的应用程序,可以在用户的计算机上显示多个时区的时间。这本身是微不足道的;一个带有计时器的简单窗口,它将获取当前 UTC 时间并将其转换为他们想要查看的任意数量的时区,以更新某些标签的文本。
不过,问题就在这里;为了满足各种要求,窗口永远不会被桌面上的任何其他东西遮挡或遮挡。用户将运行其他必须始终完全可见的应用程序,同时该应用程序不能被这些窗口之一覆盖。
因此,我正在考虑通过以下两种方式之一来实现它:
作为一个始终位于顶部的应用程序,但背景将完全透明,时间显示将是 50% 透明或类似。将鼠标移到窗口上将通过删除其透明度和/或添加不透明的高对比度背景来“突出显示”时间显示。据我所知,这个解决方案不能使用Windows Aero,因为主要用户的操作系统是Windows XP。
作为一个使用低级 Windows 消息以某种方式模仿 Windows 任务栏在“始终位于最前面”模式下的行为的应用程序;它将停靠在屏幕顶部,始终显示在“正常”状态窗口的顶部,此外还将控制其他窗口的“最大化”行为,以便这些窗口在最大化时不会与它重叠。
我真的不知道从哪里开始实现其中任何一个,但我大胆猜测,考虑到 WinXP 的限制,如果可能的话,第二个选项会更容易。那么,我需要实现哪些行为来告诉 Windows 永远不要在窗体顶部最大化?
作为墓志铭,由于 Hans Passant 似乎不愿发表答案,我发现我需要的是使应用程序成为“应用程序桌面工具栏”或 Appbar。 Hans 给出的 CodePlex 链接,http://codeproject.com/KB/dotnet/AppBar.aspx以及有关该主题的 MSDN 文章,http://msdn.microsoft.com/en-us/library/windows/desktop/cc144177%28v=vs.85%29.aspx,提供很多信息。我几乎能够将定义 AppBar 行为的 CodePlex 代码区域复制/粘贴到其他正常的 .NET 表单中,以创建一个简单的概念验证:
![enter image description here](https://i.stack.imgur.com/BKBSy.png)
我对 CodePlex 代码所做的一个更改是,将 RegisterBar() 的一半(将表单注册为 AppBar)与拆除它的代码分开,因此对 RegisterBar() 的调用始终会执行此操作,而不是交替注册和取消- 注册它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)