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

Winapi 如何使另一个应用程序的窗口透明?,winapi,windows-7,transparent,Winapi,Windows 7,Transparent,我知道如何使用分层窗口使我自己的应用程序透明,但我想使另一个应用程序透明,例如记事本。 我编写了这样的代码,但除了我的应用程序主窗口外,它不适用于其他窗口: SetWindowLongPtr(WindowFromPoint(p), GWL_EXSTYLE, GetWindowLongPtr(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); SetLayeredWindowAttributes(WindowFromPoint(p), 0,

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

SetWindowLongPtr(WindowFromPoint(p), GWL_EXSTYLE, 
                 GetWindowLongPtr(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(WindowFromPoint(p), 0, (255 * 50) / 100, LWA_ALPHA);
其中p是屏幕上的一个点,例如我用鼠标选择的窗口


我还感兴趣的是,是否有一种方法可以直接从Windows7执行此操作,而不一定是编程的。我想一定有办法做到这一点,因为每个应用程序都在它自己的表面上呈现,DWM将它们合成到最终图像中。

您对SetWindowLongPtr使用的窗口句柄与对GetWindowLongPtr使用的窗口句柄不同,这是您的代码中的错误还是您的问题中的键入错误

以下代码适用于我在WindowsServer2003和Windows7上的操作

   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返回应用程序的顶级窗口时,它才起作用;如果它返回子窗口,则代码不起作用。因此,当鼠标放在我想要透明的窗口的标题上时,它就会工作,但通常不会在其他任何地方。
用记事本测试

oops,是的,这是一个bug。谢谢,但仍然不起作用:p非常感谢,我的代码也起作用,但我硬编码了点结构中的值,并手动将所需的窗口放置到该位置..:我想我只是没有点击标题。再次感谢你。