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

2023-12-07

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

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

对我来说最简单的方法是:

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

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

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

  • 我认为应该有一种方法可以通过调用来获取直接位于表单下方的窗口的 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,但我认为它们不适合处理我的情况。

任何帮助将不胜感激。


您可以自己进行检查,因为您需要进行超出标准功能提供的自定义。

  1. Call EnumWindows()获取顶级窗口的列表。
  2. 从此列表中删除半透明窗口。
  3. 对于列表中的每个窗口使用PtInRegion()确定鼠标是否位于窗口上方。拆除所有不符合要求的窗户。
  4. Use GetNextWindow(),从剩余的窗口之一开始遍历 z 顺序并找出哪个候选窗口位于顶部。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取鼠标指针下方的窗口句柄,同时忽略半透明窗口 的相关文章

  • C# SMO 远程数据库备份到本地机器

    我有一个执行 SQL 数据库备份和恢复的应用程序 这在本地计算机上运行良好 但是如果我针对另一台计算机上托管的 SQL 服务器运行此应用程序 则会出现以下错误 Microsoft SqlServer Management Smo Faile
  • 使用 R.Net 版本 1.5.5 创建 REngine 实例

    我正在尝试创建一个 Hello World 示例R Language using R Net版本1 5 5 从 NuGet 加载 不幸的是 我见过的在线示例都不起作用 这就是我所做的 已安装Microsoft R Open 3 2 4 增强
  • 增强缓冲区调用后丢失自定义点类型的数据

    我有我自己的观点 class LocationWayPoint public latlong container location WORD index PWeakBasicStation station namespace boost n
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • 我应该始终使用 TryGetValue 来访问 .net 词典吗?

    In 另一个问题 https stackoverflow com questions 886814 why doesnt net provide us with the key when it raises a keynotfound ex
  • 使用 Rhino Mocks 模拟集合

    所以我猜这是很多人想做的事情 模拟集合 过去我用 Rhino 做过这样的事情 var col mock MockRepository GenerateMock
  • std::string substr 方法问题

    你好 我正在写这个方法 我希望它从给定缓冲区中提取给定位置的一部分 我有一个像这样的字符串something one something two我想要得到 一个 这是我的想法 static std string Utils getHeade
  • 不使用 DAO 压缩 Microsoft Access 数据库

    我用CDatabase类开一个ACCDB访问数据库 司机是 T Microsoft Access Driver mdb accdb 我可以打开并使用数据库 已经这样做很多年了 if DatabaseExist m strMDBPath AJ
  • Makefile:如何正确包含头文件及其目录?

    我有以下 makefile CC g INC DIR StdCUtil CFLAGS c Wall I INC DIR DEPS split h all Lock o DBC o Trace o o cpp DEPS CC o lt CFL
  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • 使用 itextSharp 5.3.3 对 Pdf 文档进行数字签名和验证

    我正在尝试使用 iTextSharp 5 3 3 在服务器 c 上进行数字签名和验证 pdf 文档 我使用 DigiSign 在线工具 生成了 Pfx 文件 然后使用 Windows 生成证书 cer 文件
  • 更改为通用接口对性能的影响

    我使用 Visual Studio 使用 C NET 开发应用程序 ReSharper 在我的方法原型中经常建议我用更通用的类型替换输入参数的类型 例如 如果我仅在方法主体中使用带有 foreach 的列表 则使用 List 和 IEnum
  • IOS Box2D - 身体遵循基于速度波动的点数组的特定路径

    我有一个关于身体的问题 它遵循特定的路径 首先是将身体移动到目标点的方法 const float destinationControl 0 3f b2Vec2 targetPosition path counter b2Vec2 missi
  • ld: 无法对非 PE 输出文件执行 PE 操作错误

    我是操作系统编程的新手 我正在读一本书 其中给出了一个简单的内核示例 如下所示 main char video memory 0xb8000 video memory X 为了编译这个名为 kernel c 的文件 我在 Windows 7
  • 如何同时正确使用管道和信号?

    我有 2 个孩子 我想将信号从孩子发送到父母 并将答案 随机数 为什么 为什么不 命名管道从父母发送到每个孩子 我有这个代码 include
  • GCC编译非常慢(文件大)

    我正在尝试编译一个大的 C 文件 专门用于 MATLAB mexing C 文件大约 20 MB 可用来自 GCC 错误跟踪器 https gcc gnu org bugzilla attachment cgi id 36632如果你想玩一
  • 命名管道端口号

    命名管道是否使用端口进行通信 我使用的命名管道 http msdn microsoft com en us library aa365150 28VS 85 29 aspx http msdn microsoft com en us lib
  • 使用具有透明度的 IndexColorModel 绘制图像

    这是我的问题 我想在基于具有透明度的 IndexColorModel 的 BufferedImage 上应用转换 平移 旋转 剪辑 索引 0 是我的透明像素 索引 1 是黑色 索引 2 是白色 依此类推 源图像 即在转换之前 被实例化如下
  • 编写一个转储屏幕像素的 RDP 客户端

    我想在中实现 RDP 客户端C 它能够获取屏幕所有像素的颜色值并将它们转储到文件中 我知道这在概念上与 RDP 的工作方式不同 但我的应用程序需要它 我正在尝试利用freerdp https github com FreeRDP FreeR
  • 即使没有任何转换,也违反了 C 中的严格别名?

    How can i and u i在此代码中打印不同的数字 即使i定义为int i u i 我只能假设我在这里触发了 UB 但我不知道具体是如何触发的 ideone演示 http ideone com Gcv5Xm如果我选择 C 作为语言

随机推荐