alphablend (transparencia) em qualquer janela do windows

Delphi

12/11/2008

Criei essa função:

procedure setAlphaBlend(hTransp: hwnd; semitransp, cortransp: boolean; niveltransp: byte; numcortransp: cardinal);
const
  cUseAlpha: array[Boolean] of Integer = (0, LWA_ALPHA);
  cUseColorKey: array[Boolean] of Integer = (0, LWA_COLORKEY);
var
  AStyle: Integer;
begin
  AStyle := GetWindowLong(htransp, GWL_EXSTYLE);
  SetWindowLong(htransp, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
  SetLayeredWindowAttributes(htransp, numcortransp, niveltransp, cUseAlpha[semitransp] or cUseColorKey[cortransp]);
end;

para poder setar um alpha em qualquer janela do windows que se saiba o handle.

(me baseei no source da Tform e nas chamadas que ela faz à api do windows)

O handle pode ser pego com getwindowfrompoint ou getforegroundwindow.

E esse programa:

unit Unit1;

interface

uses
  Windows,
  Messages,
  Graphics,
  Forms,
  AppEvnts,
  RXShell,
  Menus, Classes;

type
  TfrmTransp = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    RxTrayIcon1: TRxTrayIcon;
    PopupMenu1: TPopupMenu;
    Fechar1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    procedure ApplicationEvents1Minimize(Sender: TObject);
    procedure Fechar1Click(Sender: TObject);
  private
    { Private declarations }
  public
      procedure Transparente(id:Integer);
  end;

var
  frmTransp: TfrmTransp;

procedure setAlphaBlend(hTransp: hwnd; semitransp, cortransp: boolean; niveltransp: byte; numcortransp: cardinal);

implementation

{$R *.dfm}

procedure setAlphaBlend(hTransp: hwnd; semitransp, cortransp: boolean; niveltransp: byte; numcortransp: cardinal);
const
  cUseAlpha: array[Boolean] of Integer = (0, LWA_ALPHA);
  cUseColorKey: array[Boolean] of Integer = (0, LWA_COLORKEY);
var
  AStyle: Integer;
begin
  AStyle := GetWindowLong(htransp, GWL_EXSTYLE);
  SetWindowLong(htransp, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
  SetLayeredWindowAttributes(htransp, numcortransp, niveltransp, cUseAlpha[semitransp] or cUseColorKey[cortransp]);
end;

procedure TfrmTransp.FormCreate(Sender: TObject);
var i: Integer;
begin
  //coloca o icone para a barra de tarefas
  RxTrayIcon1.Icon := Application.Icon;

  //esconde a janela da aplicação e a barra de minimizado
  ShowWindow(Application.Handle, SW_HIDE);
  ShowWindow(Handle, SW_HIDE);

  //registra 10 hotkeys, de ctrl+shift 0.. até 9   (i é o id da hotkey e 48+i são os codigos ascii das teclas numericas do teclado normal)
  for i := 0 to 9 do
    RegisterHotKey(Handle, i, MOD_CONTROL or MOD_SHIFT, 48+i);
end;

procedure TfrmTransp.FormDestroy(Sender: TObject);
var i: Integer;
begin

  //desregistra as hotkeys
  for i := 0 to 9 do
    UnregisterHotKey(Handle, i);
end;

procedure TfrmTransp.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin

  //esse appevents monitora as mensagens do sistema procurando por mensagens de hotkey para saber que uma key foi pressionada
  if Msg.message = wm_hotkey   then
  begin
    //wparam é o id da hotkey pressionada
    case Msg.wParam of
      0..9: Transparente(Msg.wParam);
    end;
  end;
end;


procedure TfrmTransp.ApplicationEvents1Minimize(Sender: TObject);
begin
  //esconde janelas ao minimizar
  ShowWindow(Application.Handle, SW_HIDE);
  ShowWindow(Handle, SW_HIDE);
end;

procedure TfrmTransp.Transparente(id: Integer);
var       hForeground: Thandle;
begin

  //faz a janela ativa ficar transparente, ou reaparecer se o id for 0
  hForeground := GetForegroundWindow;
  if (id = 0) then
    setAlphaBlend(hForeground, true, false, 255, 0)
  else
    setAlphaBlend(hForeground, true, false, Byte((id)*25), 0);

end;

procedure TfrmTransp.Fechar1Click(Sender: TObject);
begin
  close;
end;

end.


para setar transparencia em qualquer janelaativa usando ctrl+shift+um numero de 0 a 10. (usei um rxtrayicon e um popupmenu, mas vc pode usar o trayicon que quizer ou nem usar.)


Será que funciona no vista?

Ou então criar no delphi 7 uma form normal com um numero tipo 100 de alphablendvalue e a propriedade alphablend := true da form principal, só para ver se fica transparente ou não. Alphablend funfa no vista?


Vitor Rubio

Vitor Rubio

Curtidas 0
POSTAR