我创建了一个半透明表单(60% 不透明度,黑色背景色),我的应用程序在整个屏幕上启动该表单并最大化。基本上,它在整个桌面上投射灰色。
当用户将鼠标悬停在桌面上的窗口上时,我想获取该窗口的句柄(hWnd)。
对我来说最简单的方法是:
- 暂时隐藏我的表单(或者,暂时将我的表单的不透明度设置为 0.0)
- 调用 [GetCursorPos][1]
- 调用 [WindowFromPoint][2]
- 再次显示我的表格
这种方法的问题是我的表单/屏幕闪烁,这是我不喜欢的。
我尝试通过两种方式解决这个问题:
我认为应该有一种方法可以通过调用来获取直接位于表单下方的窗口的 hWndChildWindowFromPointEx(传入桌面的 hWnd 和CWP_SKIPTRANSPARENT
),但似乎不起作用。我也玩过 [ChildWindowFromPoint][4] 和 [RealChildWindowFromPoint][5] 但没有成功。 (P.S. Raymond Chen 讨论了这些调用之间的差异,here在我看来,ChildWindowFromPointEx 的设计正是为了满足我的需要)
我尝试通过使用(1)来阻止整个桌面刷新(有点“冻结”屏幕)SendMessage(GetDesktopWindow(), WM_SETREDRAW, false, 0)
在我隐藏我的表格之前和(2)SendMessage(GetDesktopWindow(), WM_SETREDRAW, true, 0)
在我隐藏我的表格之后。这不太正常:屏幕的某些区域会冻结,会出现一些奇怪的黑色块,等等。但是,我确实知道(1)确实有效,因为有一次我打电话给(1)但没有调用 (2),我的桌面似乎完全冻结(必须重新启动,甚至 TaskMgr 也无法正确渲染)。我还尝试在表单上使用 SuspendLayout 和 ResumeLayout,但我认为它们不适合处理我的情况。
任何帮助将不胜感激。
您可以自己进行检查,因为您需要进行超出标准功能提供的自定义。
- Call
EnumWindows()
获取顶级窗口的列表。
- 从此列表中删除半透明窗口。
- 对于列表中的每个窗口使用
PtInRegion()
确定鼠标是否位于窗口上方。拆除所有不符合要求的窗户。
- Use
GetNextWindow()
,从剩余的窗口之一开始遍历 z 顺序并找出哪个候选窗口位于顶部。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)