2010-02-19 151 views
3

我知道如何使用Layered 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将它们合成到最终的图像中。

回答

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返回应用程序的顶层窗口,如果它返回一个子窗口的工作,那么,代码不起作用。所以当鼠标移动到我想透明的窗口的标题上时,它通常不起作用,但通常不在其他地方。 (测试记事本)

+0

哎呀,是的,这是一个错误。谢谢,但它仍然不起作用:P – Sil 2010-02-20 09:17:11

+0

非常感谢你,我的代码也可以工作,但我在POINT结构中硬编码了这些值,并手动将所需的窗口放到了那个位置.. :)我想我只是没有做到这一点,不要打上标题。再次感谢你。 – Sil 2010-02-20 16:59:38

相关问题