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

时间:2010-02-19 23:54:08

标签: winapi windows-7 transparent

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

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将它们组合成最终图像。

1 个答案:

答案 0 :(得分:2)

您使用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返回应用程序的顶级窗口时才有效,如果它返回子窗口,则代码不起作用。所以当鼠标悬停在窗口标题上时我会想要透明,但通常不在其他任何地方。 (用记事本测试)