如何使我的最顶部窗口始终保持在最上层?

6
我将首先解释我为什么需要它,因为我预计第一个回复会是“你为什么需要它?”。我想要检测鼠标光标是否在屏幕边缘,而且我不想使用钩子。因此,我创建了一个像素宽的TOPMOST不可见窗口。
我正在使用Win XP上的C++,所以当窗口被创建(CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT ...)时,一切都正常。
不幸的是,如果用户移动另一个置顶窗口,例如任务栏覆盖我的窗口,我就无法获取鼠标移动事件。
我尝试通过类似于建议中提出的方法来解决这个问题: 如何使MDI窗口始终置顶 我试图在WM_WINDOWPOSCHANGED中首先检查我的topmost窗口的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()将我的窗口置于最上层,“默认输入法”仍会保持在最上层。我不知道什么是“默认输入法”,也不知道如何检测任务栏是否在我的窗口之上。

我的问题是:如何检测我的最上面的窗口已经不再是最顶部的窗口,并且如何保持它在顶部?

P.S. 我知道定期将我的窗口置于最上层的“蛮力”方法可以解决问题,但这样做很丑陋,可能会对通知窗口产生一些不必要的影响(将我的窗口置于最上层会隐藏通知窗口)。

谢谢您的时间和建议!

1个回答

8

7
陈的文章不好。作为用户,我只想要一个程序来完成它。我永远不会同时启动两个这样的程序。所以,即使当两个程序尝试同时成为最顶层时宇宙崩溃了,我也不在意。 - noober

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接