gpt4 book ai didi

c# - 获取鼠标指针下方的窗口句柄,同时忽略半透明窗口

转载 作者:可可西里 更新时间:2023-11-01 09:17:44 24 4
gpt4 key购买 nike

我创建了一个半透明的表单(60% 的不透明度和黑色背景),我的应用程序在启动时最大化了整个屏幕。基本上,它会在整个桌面上转换出一种灰色。

当用户将鼠标悬停在桌面上的窗口上时,我想获取该窗口的句柄 (hWnd)。

对我有用的简单方法是:

  1. 暂时隐藏我的表单(或者,暂时将我的表单的不透明度设置为 0.0)
  2. 调用 [GetCursorPos][1]
  3. 调用 [WindowFromPoint][2]
  4. 再次显示我的表单

这种方法的问题是我的表单/屏幕闪烁,这是我不喜欢的。

我尝试通过两种方式解决这个问题:

  • 我认为应该有一种方法可以通过调用 ChildWindowFromPointEx 直接在我的窗体下方获取窗口的 hWnd。 (传入桌面的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) 在我隐藏我的表单之后。这不太正确:屏幕的某些区域会卡住,会出现一些奇怪的黑 block ,等等。但是,我确实知道 (1) 确实有效,因为有一次我调用 (1) 但没有调用 (2),我的桌面出现完全卡住(必须重新启动,甚至 TaskMgr 也无法正确呈现)。我还尝试在我的表单上使用 SuspendLayout 和 ResumeLayout,但我认为它们不能处理我的情况。

如有任何帮助,我们将不胜感激。

最佳答案

您可以自己进行检查,因为您需要在标准函数提供的范围之外进行自定义。

  1. 调用 EnumWindows() 获取顶层窗口列表。
  2. 从此列表中删除您的半透明窗口。
  3. 对于列表中的每个窗口,使用 PtInRegion() 确定鼠标是否在窗口上。移除所有不符合要求的 window 。
  4. 使用 GetNextWindow(),从剩余窗口之一开始遍历 z 顺序并找出哪个候选窗口位于顶部。

关于c# - 获取鼠标指针下方的窗口句柄,同时忽略半透明窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6946371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com