【问题标题】:Creating a .NET app that "docks" to the side of the screen and limits other windows' sizes when maximized创建一个“停靠”到屏幕一侧并在最大化时限制其他窗口大小的 .NET 应用程序
【发布时间】:2012-01-20 13:22:19
【问题描述】:

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

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

所以,我正在考虑通过以下两种方式之一来实现它:

  • 作为一个始终在顶部的应用程序,但背景将完全透明,时间显示将是 50% 透明或类似的。将鼠标移到窗口上会“突出显示”时间显示,方法是移除其透明度和/或添加不透明的高对比度背景。 AFAIK 这个解决方案不能使用 Windows Aero,因为主要用户的操作系统是 Windows XP。

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

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

【问题讨论】:

  • 我已经有一段时间没有看过它们了,但我想知道 Yahoo Widgets 之类的东西是否可以完全满足您的要求,而无需编写任何东西。 widgets.yahoo.com
  • 您需要 pinvoke SHAppBarMessage()。大量的谷歌点击,第一次点击:codeproject.com/KB/dotnet/AppBar.aspx
  • @dkackman:这是个好主意,但我认为高层不会在这些工作站上安装雅虎产品。有问题的 regs 是 UL regs,计算机基本上是由呼叫人员使用的,所以他们把工作站锁得很紧。
  • @HansPassant:这正是我所需要的。我会进行更多研究,看看这在我们的情况下是否可行,但基本概念完全符合我们的要求。

标签: .net user-interface gdi


【解决方案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 表单中,以创建一个简单的概念验证:

我对 CodePlex 代码所做的一项更改是将用于将表单注册为 AppBar 的 RegisterBar() 的一半与将其拆除的代码分开,因此对 RegisterBar() 的调用始终会执行此操作,而不是交替执行注册和注销它。

【讨论】:

    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多