如何保持我最上面的窗口?

我将首先解释为什么我需要它,因为我预计第一个回应将是“为什么你需要它?”。 我想检测当鼠标光标在屏幕的边缘,我不想使用钩子。 因此,我创build了一个像素宽的TOPMOST隐形窗口

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

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

我试图解决这个问题类似的方法build议如何保持一个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); 

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

所以我的问题是:如何检测到我的最顶层的窗口不再是顶层的顶层窗口,以及如何保持顶层?

PS我知道一个“暴力”的方法,定期把我的窗口顶部作品,但是丑陋的,可能有一些不必要的推论与通知窗口,例如。 (将我的窗口置于顶部将隐藏通知窗口。)

谢谢你的时间和build议!

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

Raymond Chen在这方面有很好的文章。

也是这个的重复。