Ir para conteúdo
Faça parte da equipe! (2024) ×
Conheça nossa Beta Zone! Novas áreas a caminho! ×
  • Quem está por aqui   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.

Menu Iniciar e Barra de Tarefas Transparente


Ryokusei
 Compartilhar

Posts Recomendados

Antes de inicar os códigos vou explicar sobre o assunto.

Para mecher em qualquer janela (sim o botão iniciar e a barra de tarefas são janelas) é necessário ter em mãos o "Handle" desta janela. Handle é um número identificador da janela que a diferencia das outras. Toda janela tem um handle diferente da outra não importa que sejam janelas da mesma classe.

A classe janela é um conjunto de atributos que o sistema utiliza como modelo para criar uma janela. Cada janela é um membro de uma classe janela. Todas as classes janela são específicas do processo.

 

Um exemplo é um Button do Delphi e um botão de uma janela do Windows (provavelmente escrito em C++).

A classe do Button do Delphi é "TButton" enquanto a de uma janela escrita em C++ é "Button".

O mesmo acontece com labels, em Delphi a classe é "TLabel" e em C++ "Static".

Você pode sim mudar o nome da classe de uma janela só por estilo ou seja lá qual for o motivo e criar a janela no estilo que quiser, mas para isso você deve criar a classe e registrá-la (vou abordar isso mais a frente).

 

Existem janelas pai (Parent Window) e janelas filho (Child Window).

Janelas pai são as janelas principais como por exemplo um "Form" do Delphi.

Janelas filho são as janelas que foram criadas como Child Window de uma outra janela, por exemplo um botão do Delphi, ele é uma janela Child da janela Parent que é o Form, para verificar isso veja que a propriedade Button1.Parent.Handle é igual a Form1.Handle .

 

Para encontrar o handle do menu iniciar e da barra de tarefas vamos procurá-los por sua classe.

A classe do menu iniciar é: DV2ControlHost

A classe da barra de tarefas é: Shell_TrayWnd

 

Como eu sei a classe do menu iniciar e da barra de tarefas? Não só deles mas de qualquer janela, como obter essas informações?

Você pode fazer download deste software que eu escrevi em Delphi:

Para fazer download dos arquivos clique em 'Skip Advertisement'!

[DOWN]

É necessário se cadastrar para acessar o conteúdo.
[/DOWN]

Scan:

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos iniciar nosso aplicativo.

 

É necessário se cadastrar para acessar o conteúdo.

 

Insira 1 Button, 3 Labels e 1 TrackBar no Form.

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora altere o caption dos objetos e organize como na imagem:

 

É necessário se cadastrar para acessar o conteúdo.

 

As principais propriedades dos objetos ficam:

 

Button1:

Left = 8

Top = 8

Width = 113

Height = 25

Caption = Fazer Transparente

 

Label1:

Left = 8

Top = 40

Width = 101

Height = 13

Caption = Handle Menu Iniciar:

 

Label2:

Left = 8

Top = 56

Width = 119

Height = 13

Caption = Handle Barra de Tarefas:

 

Label3:

Left = 8

Top = 72

Width = 136

Height = 13

Caption = Nível de Transparência: 255

 

TrackBar1:

Left = 8

Top = 96

Width = 297

Height = 45

Max = 255

Frequency = 17

Position = 255

TabOrder = 1

 

Agora vamos a parte de código. Vá ao Code Explorer (janela onde fica o código de programação) e vá até a parte onde está escrito:

 

var

Form1: TForm1;

 

Altere para:

 

var

Form1: TForm1;

HMenu, HBarra: HWND;

 

É necessário se cadastrar para acessar o conteúdo.

 

Declarei as variáveis globais "HMenu" e "HBarra" como do tipo "HWND" (é a mesma coisa que Cardinal).

HMenu será onde armazenarei o handle do menu iniciar e HBarra onde armazenarei o handle da barra de tarefas.

 

De volta ao form, dê dois cliques sobre ele para ir ao evento OnCreate.

Lá insira isso no procedimento:

 

HMenu:=0;

HBarra:=0;

 

É necessário se cadastrar para acessar o conteúdo.

 

Declarei o valor inicial de ambos como zero, pois caso o handle de algum não seja encontrado não haverá efeito em mecher com handle 0.

 

De volta ao form, dê dois cliques sobre o objeto TrackBar1 para ir ao evento OnChange dele.

Lá insira isso no procedimento:

 

label3.Caption:='Nível de trasnparência: '+IntToStr(TrackBar1.Position);

 

É necessário se cadastrar para acessar o conteúdo.

 

Isso faz com que sempre que o usuário mudar a posição do TrackBar1 a mesma esteja indicada no Label3.

 

De volta ao form, dê dois cliques sobre o Button1 para ir ao evento OnClick.

Lá insira isso no procedimento:

 

EnumWindows(@EnumWindowsProc, 0);

Label1.Caption:='Handle Menu Iniciar: '+IntToHex(HMenu, 0);

Label2.Caption:='Handle Barra de Tarefas: '+IntToHex(HBarra, 0);

SetWindowLong(HMenu, GWL_EXSTYLE, GetWindowLongA(HMenu, GWL_EXSTYLE) or WS_EX_LAYERED);

SetLayeredWindowAttributes(HMenu, 0, Trackbar1.Position, LWA_ALPHA);

SetWindowLong(HBarra, GWL_EXSTYLE, GetWindowLongA(HBarra, GWL_EXSTYLE) or WS_EX_LAYERED);

SetLayeredWindowAttributes(HBarra, 0, Trackbar1.Position, LWA_ALPHA);

HMenu:=0;

HBarra:=0;

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora encima do procedimento OnClick do Button1 declare esta função:

 

function EnumWindowsProc(wHandle: HWND; Sender: TObject): Bool; stdcall; export;

var

ClassName: array[0..255] of char;

begin

Result := True;

GetClassName(wHandle, ClassName, 255);

if string(ClassName)='DV2ControlHost' then HMenu:=wHandle;

if string(ClassName)='Shell_TrayWnd' then HBarra:=wHandle;

end;

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora é só rodar a aplicação e testar você mesmo.

 

Download dos arquivos do projeto:[DOWN]

É necessário se cadastrar para acessar o conteúdo.
[/DOWN]

Scan:

É necessário se cadastrar para acessar o conteúdo.

Link para o comentário
Compartilhar em outros sites

Poxa , tutorial vem explicado bastante imagens , simples e muito bem feito , gostei bastante , pode ajudar muitos mas uma boa coisa para melhorar um tutorial é explicar cada comando mais ae alem de não conferir com seu objetivo , seria um tutorial muito maior !!!XD:)

Link para o comentário
Compartilhar em outros sites

Poxa , tutorial vem explicado bastante imagens , simples e muito bem feito , gostei bastante , pode ajudar muitos mas uma boa coisa para melhorar um tutorial é explicar cada comando mais ae alem de não conferir com seu objetivo , seria um tutorial muito maior !!!XD:)

 

Eu sei, mas não adianta explicar muito sobre as APIs que usei aí. Mesmo que eu explicasse acho q mt gente não entenderia por não ter experiência suficiente, portanto preferi não complicar. Se você tem alguma dúvida sobre alguma coisa sinta-se a vontade para perguntar.

Link para o comentário
Compartilhar em outros sites

Este tópico está impedido de receber novos posts.
 Compartilhar

×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.