在Delphi中使其他应用程序窗口半透明

时间:2011-04-07 18:45:44

标签: windows delphi delphi-xe lazarus translucency

美好的一天

我在网上搜索了有关这是否可行的任何指示,但无济于事。我需要编写一个应用程序,允许我选择另一个应用程序,这样可以使选定的应用程序半透明并且在顶部(如重影图像叠加)。

Delphi是否可以实现这一切?我正在使用Delphi XE和Lazarus。如果有人可以请指出我从哪里开始,我将非常感激。

提前致谢,

2 个答案:

答案 0 :(得分:4)

您可以执行此操作但不建议,因为此类行为必须由自己的应用程序处理。无论如何,如果你坚持因为你有充分的理由去做这个,这里我留下代码来设置窗口的透明度并使窗口最多,只是为了展示如何完成。

<强>透明度

您必须使用带有WS_EX_LAYERED标记的SetWindowLong功能和带LWA_ALPHA的{​​{3}}功能来设置透明度。

Procedure SethWndTrasparent(hWnd: HWND;Transparent:boolean);
var
 l        : Longint;
 lpRect   : TRect;
begin
    if Transparent then
    begin
      l := GetWindowLong(hWnd, GWL_EXSTYLE);
      l := l or WS_EX_LAYERED;
      SetWindowLong(hWnd, GWL_EXSTYLE, l);
      SetLayeredWindowAttributes(hWnd, 0, 180, LWA_ALPHA);
    end
    else
    begin
      l := GetWindowLong(hWnd, GWL_EXSTYLE);
      l := l xor WS_EX_LAYERED;
      SetWindowLong(hWnd, GWL_EXSTYLE, l);
      GetWindowRect(hWnd, lpRect);
      InvalidateRect(hWnd, lpRect, true);
    end;
end;

让Windows最顶层

您必须使用SetLayeredWindowAttributes函数传递HWND_TOPMOST值,该值将窗口置于所有非最顶层的窗口之上。即使停用窗口,窗口也会保持最高位置。

Procedure SethWndOnTop(hWnd: HWND);
var
  lpRect   : TRect;
begin
  if GetWindowRect(hWnd,lpRect) then
  SetWindowPos(hWnd , HWND_TOPMOST, lpRect.left, lpRect.top, lpRect.Right-lpRect.left, lpRect.Bottom-lpRect.Top, SWP_SHOWWINDOW);
end;

答案 1 :(得分:3)

Windows可以做到这一点,但是应用程序没有希望能够做到这一点。