Identificando Mudanças no ClipBoard - Delphi
Veja neste artigo como podemos interceptar a mensagem que indica que o conteúdo do ClipBoard do Windows foi modificado.
Olá pessoal, hoje venho mostrar uma rotina interessante para aqueles que querem trabalhar com mensagens do sistema operacional. Como sabemos o sistema operacional conversa através de mensagens, e o Delphi consegue interpretar, capturar, entender estas mensagens. Vou fazer uma simulação bem simples desta vez.
Vamos precisar de um Formulário e nele um TRichEdit

Figura 1. Layout do Formulário
Esta bem simples pois o objetivo não é o layout mas sim a funcionalidade.
Neste momento vamos dar uses na unit Clipbrd
Listagem 1: Nossa unit deverá esta neste estilo
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Clipbrd;
type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
Listagem 2: Com a uses declarada agora vamos implementar um método para poder "escutar" quando alguma coisa for adicionada no Clipboard( nosso famoso CTRL + c ).
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Clipbrd;
type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
private
{ Private declarations }
procedure ClipBoardChanged(var Message: TMessage); message WM_DRAWCLIPBOARD;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
Listagem 3: Depois de declarar, vamos agora implementar a mesma, com o mouse dentro da Classe TForm1 ou então em cima do método ClipBoardChanged, vamos pressionar CTRL+SHIFT+C e teremos o seguinte resultado :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Clipbrd;
type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
private
{ Private declarations }
procedure ClipBoardChanged(var Message: TMessage); message WM_DRAWCLIPBOARD;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ClipBoardChanged(var Message: TMessage);
begin
end;
end.
Listagem 4: Dentro da procedure ClibBoard, vamos implementar o seguinte :
procedure TForm1.ClipBoardChanged(var Message: TMessage);
begin
ShowMessage('Houve mudança no CTRL + C');
RichEdit1.Text := Clipboard.AsText;
end;
Este código irá apresentar um ShowMessage com uma mensagem e o texto que foi copiado irá ser exibido dentro do RichEdit.
Nota: Fiz o exemplo apenas para texto, se você copiar uma imagem ou arquivo, ele irá exibir o ShowMessage, porém nada irá acontecer com o RichEdit. Ok ? Tem como tratar o tipo de conteúdo do Clipboard, mas isso fica para um outro artigo.
Listagem 5: Vamos então concluir nosso exemplo, localize o evento onCreate do Formulário e implemente o mesmo, logo em seguida fazer a chamada da mensagem da seguinte forma :
procedure TForm1.FormCreate(Sender: TObject);
begin
SetClipboardViewer(Handle);
end;
Concluindo assim nosso artigo, sempre que seu formulário estiver aberto e você copiar um determinado texto o mesmo será adicionado dentro do TRichEdit.
Existem milhares e milhares de mensagens no nosso sistema operacional!
Um abraço
Wesley Yamazack
Coordenador Editorial Web03. Sócio/Diretor da Lithic Soluções LTDA. Analista/Desenvolvedor Delphi da Marinha do Brasil.
7 COMENTÁRIOS
de como capturar o path do arquivo que foi copiado para o clipboard e adicionar no richedit toda vez que a mensagen for disparada eu adiciona o caminho no richedit obrigado.
Me da um tempo para poder estudar esta questão ?
Um abraço
Porém eu acredito que não seria possível realizar isto.
Na classe TClipboard "Clipbd.pas" do Delphi temos um método chamado HasFormat, onde se lê os formatos de ClipBoard.
E aparentemente estamos limitados na área de transferência com os formatos: texto, imagens e metarquivos.
CF_TEXT - Texto com uma combinação CR-LF no final de cada linha.
CF_BITMAP - gráfico de imagem do Windows.
CF_METAFILEPICT - gráfico de metarquivo do Windows.
CF_PICTURE - um objeto do tipo TPicture.
CF_OBJECT - qualquer objeto persistente.
Mesmo no Win Api "WinApi.pas" temos diversos e variados tipos de Clipboard como:
CF_OEMTEXT
CF_DIB
CF_PALETTE
CF_PENDATA
CF_RIFF
CF_WAVE
CF_UNICODETEXT
CF_ENHMETAFILE
CF_HDROP
Entre outras, mas nenhuma refere-se a paths Clipboard, mas tomara que apareça alguem dizendo que é possivel sim.
Forte abraço!
Pois Quando eu Vejo o Progresso da Cópia ele apresenta informações como o caminho da origem do arquivo e o destino do arquivo. sera que não existem nenhuma outra forma deu saber o caminho do arquivo com alguma outra classe.
o Sistema Operacional Realiza Assim Cria uma Instancia de um TStringList Adiciona Todas Arquivos na Lista e Depois Varre a Lista Colando mais ou menos assim na linguagem delphi correto ?
Claro que não sou o dono da verdade, sou um eterno aprendiz e estou tão curioso quanto você a chegar um colega e nos dizer algo diferente. continuarei a fazer pesquisas com outros colegas Delphianos, qualquer novidade posto aqui.
Forte abraço
abraço





