Fórum alphablend (transparencia) em qualquer janela do windows #366111

12/11/2008

0

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

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar