Blinue / Magpie

An all-purpose window upscaler for Windows 10/11.
GNU General Public License v3.0
8.19k stars 459 forks source link

优化对透明窗口的检测 #917

Closed Blinue closed 1 month ago

Blinue commented 1 month ago

确定一个窗口是否对鼠标透明需要考虑数个因素:

  1. 窗口可见
  2. 鼠标位于窗口内
  3. 窗口没有被冻结
  4. 窗口没有 WS_EX_TRANSPARENT 样式
  5. 如果窗口是分层窗口,使用 ChildWindowFromPointEx 判断该点是否透明,似乎没有公开的 API 能检测分层窗口是否透明
  6. 如果窗口使用 SetWindowRgn 自定义形状,使用 PtInRegion 判断该点是否透明

注意事项:

  1. 无需考虑 HTTRANSPARENT,它只能作用于子窗口
  2. ChildWindowFromPointEx 也会考虑自定义形状,但只适用于客户区。因此如果鼠标位于客户区,仅使用 ChildWindowFromPointEx 即可;反之如果窗口位于非客户区,则只需考虑自定义形状,因为分层窗口不允许非客户区透明。
  3. 如果窗口的 IL 比 Magpie 高,ChildWindowFromPointEx 会失败,因此无法检测分层窗口是否透明。