我将首先解释我为什么需要它,因为我预计第一个回复会是“你为什么需要它?”。我想要检测鼠标光标是否在屏幕边缘,而且我不想使用钩子。因此,我创建了一个像素宽的TOPMOST不可见窗口。
我正在使用Win XP上的C++,所以当窗口被创建(CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT ...)时,一切都正常。
不幸的是,如果用户移动另一个置顶窗口,例如任务栏覆盖我的窗口,我就无法获取鼠标移动事件。
我尝试通过类似于建议中提出的方法来解决这个问题: 如何使MDI窗口始终置顶 我试图在WM_WINDOWPOSCHANGED中首先检查我的topmost窗口的Z顺序,使用以下代码:
我正在使用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. 我知道定期将我的窗口置于最上层的“蛮力”方法可以解决问题,但这样做很丑陋,可能会对通知窗口产生一些不必要的影响(将我的窗口置于最上层会隐藏通知窗口)。
谢谢您的时间和建议!