DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

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

Layout do Formulário

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.
O que você achou deste post?

    7 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Wesley Bobato
ola wesley voce poderia citar exemplos
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.
[há +1 ano] - Responder

 

[autor] Wesley Yamazack
Olá xará, gostei da ideia!

Me da um tempo para poder estudar esta questão ?

Um abraço
[há +1 ano] - Responder
 

Wesley Bobato
ok meu amigo fico no aguardo se eu aprender alguma coisa eu cito aqui muito obrigado pela sua atencao bom final de semana Deus te abencoe.
[há +1 ano] - Responder
 

Savério Vertoni Jr.
Olá Wesley Bobado, antes de mais nada gostaria de informar que posso estar enganado sobre o que opinarei no seguinte comentário.
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!
[há +1 ano] - Responder
 

Wesley Bobato
Olá Amigo Então quer Dizer que quando eu pressione CTRL+C em Diversos Arquivos o Sistema Operacional Realiza uma Copia desses Arquivos em Memoria e Quando Pressione CTRL+V ele Cola ??
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 ?
[há +1 mês] - Responder
 

Savério Vertoni Jr.
Olá Wesley Bobato, eu entendi sua necessidade, mas conforme pesquisas a documentação da Embarcadero diz o seguinte:"Quando ler informação da área de transferência com a classe do Delphi TClipboard, estamos limitados aos formatos da área de transferência padrão: texto, fotos e metafiles". Tem outros formatos sim, conforme comentário no post acima, mais nenhum deles se refere ao Path do arquivo na área de transferência.
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
[há +1 mês] - Responder
 

Savério Vertoni Jr.
Olá Wesley, pesquisando melhor sobre sua pergunta e descobri que é possível sim, obter o path de um arquivo na areá de transferência vou preparar um mini artigo sobre o assunto assim todos os colegas possa ter acesso a informação.
abraço
[há +1 mês] - Responder
 
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03