创建一个“停靠”到屏幕一侧的.NET应用程序,并在最大化时限制其他窗口的大小

时间:2011-12-14 18:52:16

标签: .net user-interface gdi

我收到了来自高层的有趣请求。他们想要一个简单的应用程序,它将显示在用户的计算机上,以显示多个时区的时间。这本身就是微不足道的;一个带有计时器的简单窗口,它将获取当前的UTC时间并将其转换为他们希望看到的更新某些标签文本的任意数量的时区。

但是,这是一个问题;为了满足周围的要求,窗口永远不会被桌面上的任何其他东西遮挡或遮挡。用户将运行其他必须始终完全可见的应用程序,同时这些应用程序无法被其中一个窗口覆盖。

所以,我正考虑以两种方式之一实现它:

  • 作为始终位于顶部的应用,但背景将完全透明,时间显示将是50%透明或某些此类。将鼠标移到窗口上会通过删除透明度和/或添加不透明的高对比度背景来“突出显示”时间显示。 AFAIK此解决方案无法使用Windows Aero,因为主要用户的操作系统将是Windows XP。

  • 作为一个使用低级别Windows消息以某种方式模仿Windows任务栏在“始终在线”模式下的行为的应用程序;它将停靠在屏幕的顶部,将始终显示在“正常”状态窗口的顶部,此外还将控制其他窗口的“最大化”行为,以便这些窗口在最大化时不会重叠。

我真的不知道从哪里开始实现其中任何一个,但我会冒险猜测,鉴于WinXP限制,如果可能的话,第二个选项更容易。那么,我想要实现哪些行为来告诉Windows永远不要最大化我的表单顶部?

1 个答案:

答案 0 :(得分:1)

作为一个墓志铭,由于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提供了大量信息。我能够将CodePlex中定义AppBar行为的代码区域复制/粘贴到另外正常的.NET表单中,以创建一个简单的概念验证:

enter image description here

我从CodePlex代码中做出的一个改变就是切断RegisterBar()的一半,它将表单注册为AppBar,从代码中删除它,因此对RegisterBar()的调用总是完全相反而不是交替注册和取消注册。