5

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

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

不幸的是,如果用户移动另一个最上面的窗口,例如我的窗口上方的任务栏,我不会得到鼠标移动。

我尝试以类似于中建议的方法解决此问题: 如何始终保持 MDI 窗口在最前面

我尝试首先检查 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”仍会保持在顶部。我不知道什么是“默认输入法”以及如何检测任务栏是否在我的窗口顶部。

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

PS我知道定期将我的窗口置于顶部的“蛮力”方法是可行的,但很丑陋,并且可能会对通知窗口产生一些不必要的推断。(将我的窗口置于顶部将隐藏通知窗口。)

感谢您的时间和建议!

4

1 回答 1

8

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

Raymond Chen 对此有一篇很好的文章。

也是这个的副本

于 2010-06-17T22:21:01.593 回答