如何让我的最顶层窗口保持在最顶层?

时间:2010-06-17 22:18:46

标签: c++ windows topmost

我将首先解释为什么我需要它,因为我预计第一个响应将是“你为什么需要它?”。我想检测鼠标光标何时位于屏幕边缘,我不想使用挂钩。因此,我创建了一个像素宽的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);

我将永远得到“默认IME”窗口在我的窗口顶部。即使尝试使用SetWindowPos()或BringWindowToTop()将窗口置于顶部,“默认IME”也会保持在顶部。我不知道什么是“默认IME”以及如何检测任务栏是否在我的窗口之上。

所以我的问题是:如何检测我的最顶层窗口不再是最顶层的窗口以及如何将它保持在顶部?

P.S。我知道定期将我的窗口置于顶部的“蛮力”方法仍然很难看,并且可能会对通知窗口进行一些不必要的推断。 (将我的窗口置于顶部将隐藏通知窗口。)

感谢您的时间和建议!

1 个答案:

答案 0 :(得分:8)

TopMost,总是一件棘手的事情。无法覆盖另一个将自己指定为TopMost的窗口。

Raymond Chen has a good article on this.

也是this的副本。