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.

[DELPHI] Mudar texto do botão Iniciar


Ryokusei
 Compartilhar

Posts Recomendados

[DOWN]

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

 

[sENHA]

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

 

Antes de iniciar o tutorial é necessário conhecer o conceito de:

 

Handle, Janela, Classe de Janela, Mensagem, API.

 

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 .

 

Mensagem é uma forma de comunicação utilizada na computação concorrente e paralela, programação orientada a objetos e comunicação entre processos, onde a comunicação é feita através do envio de mensagens aos destinatários.

 

API é um conjunto de rotinas e padrões estabelecidos por um software para a utilização das suas funcionalidades por programas aplicativos que não querem envolver-se em detalhes da implementação do software, mas apenas usar seus serviços. Em sumo, são funções do específicas do sistema operacional.

 

Agora vamos nos divertir.

 

Inicie o Delphi insira nele:

 

1 TLabel com Caption "Texto do Menu Iniciar";

1 TEdit com Text "" (em branco), e nome "Edit1";

2 Botões, um com Caption "Verificar" e outro com Caption "Alterar";

 

Ficando mais ou menos assim:

 

001hw.png

 

Dê dois cliques no botão "Alterar" e vamos inserir o código do evento OnClick dele.

Insira o código:

 

var StartBtnH: Cardinal;

begin

StartBtnH:=FindWindowExA((FindWindowA('Shell_TrayWnd', nil)), 0, 'Button', nil);

SetWindowTextA(StartBtnH, PAnsiChar(Edit1.Text));

SendMessageA(StartBtnH, WM_MOUSEMOVE, 0, 0);

end;

 

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

 

A variável StartBtnH vai armazenar o Handle do botão do menu iniciar.

A API FindWindowExA retorna o Handle de uma janela ANSI cuja classe e nome da janela combinam com as strings especificadas dos mesmos. A função procura em janelas filhas e não é case sensitive.

Então estamos procurando pelo Handle da janela filha de classe "Button" (classe do botão do menu iniciar) na janela pai de classe "Shell_TrayWnd" (classe da barra de tarefas).

A API SetWindowTextA altera o texto de uma janela ANSI pelo Handle dela.

A API SendMessageA envia uma mensagem à uma janela ANSI, no caso a mensagem WM_MOUSEMOVE serve apenas para atualizar o texto do menu iniciar, pois é necessário que a janela se "atualize".

 

Agora, dê dois cliques no botão "Verificar" e insira este código no evento OnClick dele:

 

var StartBtnH: Cardinal;

p: PAnsiChar;

begin

StartBtnH:=FindWindowExA((FindWindowA('Shell_TrayWnd', nil)), 0, 'Button', nil);

p:=AllocMem(100);

GetWindowTextA(StartBtnH, p, 99);

Edit1.Text:=StrPas(p);

end;

 

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

 

A variável StartBtnH vai armazenar o Handle do botão do menu iniciar.

A FindWindowExA já foi explicada.

Variáveis do tipo PAnsiChar são um ponteiro para uma string ANSI.

Estamos alocando 100 bytes no buffer, sendo um deles sempre usado pelo caractere NULL para finalizar uma string, ou seja, temos 99 caracteres para brincar.

A API GetWindowTextA grava no ponteiro "p" o texto da janela especificado pelo Handle da mesmo com o tamanho em bytes do buffer. Se fosse alocado um buffer com menos bytes que o texto da janela e fosse retornado um texto com mais bytes teríamos um Buffer Overflow, por isso sempre utilizamos o mesmo tamanho do buffer subtraído de 1 para gravar nele.

A função StrPas converte o buffer terminado em NULL localizado em ponteiro para uma string.

 

Agora, execute o projeto e veja o resultado.

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.