winapi - 如何使另一个应用程序的窗口透明?

标签 winapi windows-7 transparent

我知道如何使用分层窗口使我自己的应用程序透明,但我想使其他应用程序透明(例如记事本)。 我写了这样的代码,但它不适用于除我的应用程序主窗口之外的其他窗口:

SetWindowLongPtr(WindowFromPoint(p), GWL_EXSTYLE, 
                 GetWindowLongPtr(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(WindowFromPoint(p), 0, (255 * 50) / 100, LWA_ALPHA);

其中 p 是屏幕上的一个点(例如我用鼠标选择的窗口)

如果有一种方法可以直接从 Windows 7 执行此操作(不一定是编程的),我也很感兴趣。我认为必须有一种方法可以做到这一点,因为每个应用程序都在它自己的表面上呈现,并且 DWM 将它们合成到最终图像中。

最佳答案

您为 SetWindowLongPtr 使用的窗口句柄与为 GetWindowLongPtr 使用的窗口句柄不同,这是代码中的错误还是问题中的拼写错误?

以下代码适用于 Windows Server 2003 和 Windows 7

   POINT ptScreen = pt;
   ClientToScreen(pwnd->hdr.hwnd, &ptScreen);
   HWND hctl = WindowFromPoint(ptScreen);
   if (IsWindow(hctl))
      {
      LONG lExStyle = GetWindowLong(hctl, GWL_EXSTYLE);
      lExStyle ^= WS_EX_LAYERED;
      SetWindowLong(hctl, GWL_EXSTYLE, lExStyle);
      SetLayeredWindowAttributes(hctl, 0, 
          (lExStyle & WS_EX_LAYERED) ? (255 * 50) / 100 : 255, 
          LWA_ALPHA);
      }
   }

但是,它仅在 WindowFromPoint 返回应用程序的顶级窗口时有效,如果它返回子窗口,则代码无效。因此,当鼠标悬停在我想使其透明的窗口的标题上方时,它会起作用,但通常不会在其他任何地方起作用。 (用记事本测试)

关于winapi - 如何使另一个应用程序的窗口透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2300414/

相关文章:

android - 如何使位图透明?

Java:制作窗口点击(包括文本/图像)

c# - 使用 CreateFile 打开目录

c++ - GetTokenInformation 在 Windows XP 64 位上的意外行为

windows - Windows如何决定是否显示UAC提示符?

PHP symlink() 在 Windows 7 上失败

c++ - 如何让png具有透明属性

windows - 为什么 64 位进程不能使用 32 位 dll?

c# - Windows 7 欢迎屏幕(将 C# 翻译成 Pascal)

debugging - 为什么 flags 不启动,我启动它时它会飞溅并立即退出