如何让我最上面的窗口保持在顶部?
Posted
技术标签:
【中文标题】如何让我最上面的窗口保持在顶部?【英文标题】:How to keep my topmost window on top? 【发布时间】:2010-06-17 22:18:45 【问题描述】:我将首先解释我为什么需要它,因为我预计第一反应会是“你为什么需要它?”。我想检测鼠标光标何时位于屏幕边缘并且我不想使用挂钩。因此,我创建了一个像素宽的 TOPMOST 隐形窗口。
我在 Win XP 上使用 C++,所以当创建窗口时 (CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT ...) 一切正常。
不幸的是,如果用户移动另一个最上面的窗口,例如我的窗口上方的任务栏,我不会移动鼠标。
我尝试以类似于以下建议的方法来解决此问题: How To Keep an MDI Window Always on Top
我尝试首先检查 WM_WINDOWPOSCHANGED 中最顶层窗口的 Z 顺序
case WM_WINDOWPOSCHANGED :
WINDOWPOS* pWP = (WINDOWPOS*)lParam;
然而 pWP->hwnd 指向我的窗口并且 pWP->hwndInsertAfter 为 0,这应该意味着我的窗口在 Z 的顶部,即使它被任务栏覆盖。然后我尝试了:
case WM_WINDOWPOSCHANGED :
HWND topWndHndl = GetNextWindow(myHandle, GW_HWNDPREV)
GetWindowText(topWndHndl, pszMem, cTxtLen + 1);
我总是会发现“默认输入法”窗口位于我的窗口顶部。即使尝试使用 SetWindowPos() 或 BringWindowToTop () 将我的窗口置于顶部,“默认 IME”也会保持在顶部。我不知道什么是“默认输入法”以及如何检测任务栏是否在我的窗口顶部。
所以我的问题是:如何检测我的最顶层窗口不再是最顶层窗口以及如何将其保持在最顶层?
附:我知道定期将我的窗口置于顶部的“蛮力”方法是可行的,但很丑陋,并且可能会对通知窗口产生一些不必要的推断。 (将我的窗口置于顶部将隐藏通知窗口。)
感谢您的宝贵时间和建议!
【问题讨论】:
How to make a window always stay on top in .Net?的可能重复 【参考方案1】:TopMost,总是一件棘手的事情。无法覆盖另一个将自身指定为 TopMost 的窗口。
Raymond Chen has a good article on this.
也是this的副本。
【讨论】:
陈的文章不好。作为用户,我只想要一个程序来做这件事。我永远不会同时启动 2 个这样的程序。因此,即使当两个程序试图同时成为最顶层时宇宙崩溃了,我也不在乎。以上是关于如何让我最上面的窗口保持在顶部?的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 如何在 tableView 顶部插入单元格保持偏移和滚动惯性