【问题标题】:How to set window top of any topmost window?如何设置任何最顶层窗口的窗口顶部?
【发布时间】:2015-05-11 09:42:45
【问题描述】:

我更喜欢将任务栏设置为隐藏,但仍希望始终显示时钟。我在屏幕的右下角做了一个小时钟(80x41px)。我把它放在最上面[edit: with Timer]:

SetWindowPos(hwnd, HWND_TOPMOST, r.right - width, r.bottom - height, 0, 0, SWP_NOSIZE);
// r is my window's rect

当我点击任务栏时,我的时钟仍然在它上面。但是当我玩一些全屏游戏时,它会隐藏我的时钟。可能他们使用了一种特殊的方法。
我的问题是有什么方法可以在每个最顶层窗口的顶部显示我的窗口,甚至是活动的最顶层窗口? 我不需要我的应用获得键盘或鼠标输入,只是躺在那里显示时间。

我知道我的问题非常具体,因为我为自己编写了这个时钟。我搜索了谷歌但没有找到任何网页可以解决这个问题(this question 问同样的问题,但它想获得鼠标事件,答案说不,但我希望一个不需要输入的窗口可能是一个特殊的案例)。
任何帮助将不胜感激!

编辑
万一不可能,在屏幕上画一个矩形怎么样?由于我不需要输入,这可能是一个替代解决方案。这可能吗?

【问题讨论】:

  • 我使用了一个名为 ClockX 的时钟。它做得很好,但 Windows(或者可能只是资源管理器)有一些错误,它的最高处理。通常,当该时钟消失时,只需右键单击其系统托盘图标即可。但有时资源管理器会将自己置于其他窗口下。然后,Windows 键 + D 隐藏所有窗口,同上将它们取回。无论如何,请注意您遇到了 Windows 中的许多错误。可能会使测试复杂化。
  • 没有 API 可以做到这一点。考虑一下,如果有,其他应用程序会使用它,而您会遇到同样的问题。见blogs.msdn.com/b/oldnewthing/archive/2011/03/10/10138969.aspx

标签: c++ window topmost


【解决方案1】:

这不是很优雅,但我以前通过在一秒计时器上不断将窗口设置为HWND_TOPMOST 来解决这个问题。

【讨论】:

  • 我现在正在做,所以我可以把它放在任务栏的顶部。但是有些游戏使用特殊的方法绕过这个。
【解决方案2】:

是在自己的进程内吗?

作为一般规则,如果该进程已经是前台进程,则该进程只能期望设置前台窗口。 (Microsoft 在 SetForegroundWindow() MSDN 条目中记录了这些限制。)

【讨论】:

  • 不,只是一个简单的文本时钟,不是一直获取输入,也不是前台窗口
猜你喜欢
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
相关资源
最近更新 更多