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

Mis*_*are 5 c++ windows topmost

我将首先解释为什么需要它,因为我预计第一个响应将是"你为什么需要它?".我想检测鼠标光标何时位于屏幕边缘,我不想使用挂钩.因此,我创建了一个像素宽的TOPMOST不可见窗口.

我在Win XP上使用C++,所以当创建窗口时(CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT ...)一切正常.

不幸的是,如果用户移动另一个最顶层的窗口,例如窗口上的任务栏,我就不会移动鼠标.

我试图解决这个问题,类似于以下建议的方法: 如何保持MDI窗口始终位于顶部

我首先尝试在WM_WINDOWPOSCHANGED中检查我最顶层窗口的Z顺序

case WM_WINDOWPOSCHANGED :
    WINDOWPOS* pWP = (WINDOWPOS*)lParam;
Run Code Online (Sandbox Code Playgroud)

然后pWP-> hwnd指向我的窗口并且pWP-> hwndInsertAfter为0,这意味着我的窗口位于Z的顶部,即使它被任务栏覆盖.然后我尝试了:

case WM_WINDOWPOSCHANGED :
    HWND topWndHndl = GetNextWindow(myHandle, GW_HWNDPREV)
    GetWindowText(topWndHndl, pszMem, cTxtLen + 1);
Run Code Online (Sandbox Code Playgroud)

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

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

PS我知道周期性地将我的窗口置于顶部的"强力"方法仍然很难看,并且可能会对通知窗口进行一些不必要的推断.(将我的窗口置于顶部将隐藏通知窗口.)

谢谢你的时间和建议!

Joh*_*don 8

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

Raymond Chen有一篇很好的文章.

另外的一个重复.

  • 陈的文章没有任何好处.作为用户,我只想要一个程序.我永远不会一次启动2个这样的程序.因此,即使宇宙在两个程序试图同时成为顶级测试时崩溃,我也不在乎. (4认同)