2010-02-19 146 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

相關問題