Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-11-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
La propuesta de nlsgarcia funciona perfectamente, pero yo me refería a un verdadero visor del clipboard, tal como lo define Microshoft con la API SetClipboardViewer. Procesando el mensaje M_DRAWCLIPBOARD cada vez que se coloca algo en el clipboard.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Clipbrd;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    NextViewer: HWND;
    procedure GetData;
  protected
    procedure WndProc(var Message: TMessage); override;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Clipboard.Clear;  // Podemos limpiar o no el clipboard al comenzar
  // Nos registramos como ClipboardViewer y guardamos el anterior de la cadena
  NextViewer:= SetClipboardViewer(Handle);
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
  case Message.Msg of
  WM_DRAWCLIPBOARD:
  begin
    // Si tenemos un visor en la cadena, le reenviamos el mensaje
    if NextViewer <> 0 then
      SendMessage(NextViewer, WM_DRAWCLIPBOARD, 0, 0);
    // Miramos el ClipBoard
    GetData();
  end;
  WM_DESTROY:
    // Dejamos de ser visor del ClipBoard
    ChangeClipboardChain(Handle, NextViewer);
  end;
  inherited WndProc(Message);
end;

procedure TForm1.GetData;
begin
  Memo1.Lines.Add(Clipboard.AsText);
end;

end.


Saludos.
Responder Con Cita
  #2  
Antiguo 05-11-2014
Avatar de dblx
dblx dblx is offline
Miembro
 
Registrado: abr 2006
Posts: 28
Poder: 0
dblx Va por buen camino
Gracias

Muchisimas gracias a ambos, hoy intentaré esto que me recomendaron y comentaré
Responder Con Cita
  #3  
Antiguo 06-11-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Perfeccionando el visor del ClipBoard:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Clipbrd;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    NextViewer: HWND;
    procedure GetData;
  protected
    procedure WndProc(var Message: TMessage); override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Clipboard.Clear;  // Podemos limpiar o no el clipboard al comenzar
  // Nos registramos como ClipboardViewer y guardamos el anterior de la cadena
  NextViewer:= SetClipboardViewer(Handle);
end;

// Procesamos los mensajes a bajo nivel
procedure TForm1.WndProc(var Message: TMessage);
begin
  case Message.Msg of
  WM_DRAWCLIPBOARD:
  begin
    // Si tenemos un visor en la cadena, le reenviamos el mensaje
    if NextViewer <> 0 then
      SendMessage(NextViewer, WM_DRAWCLIPBOARD, 0, 0);
    // Miramos el ClipBoard
    GetData();
  end;

  WM_DESTROY:
    // Notificamos que dejamos de ser visor del ClipBoard
    ChangeClipboardChain(Handle, NextViewer);

  WM_CHANGECBCHAIN:
    // Nos notifican que otra App deje de ser visor del ClipBoard
    if HWND(Message.WParam) = NextViewer then
      // Alctualizamos NextViewer
      NextViewer:= Message.LParam
    else if NextViewer <> 0 then
      // Si no se actualizó reenviamos el mensaje
      SendMessage(NextViewer, WM_CHANGECBCHAIN, Message.WParam, Message.LParam);
  
  end;
  inherited WndProc(Message);
end;

procedure TForm1.GetData;
begin
  if Clipboard.HasFormat(CF_TEXT) then
    Memo1.Lines.Add(Clipboard.AsText);
end;

end.

Saludos.
Responder Con Cita
  #4  
Antiguo 06-11-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El anterior código es apropiado para S.O. Win2000 en adelante, en el caso de que nuestra aplicación sólo queramos que funcione desde Windows Vista, podemos optar por esta otra técnica, más sencilla pero que no funcionará en WinXP:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Clipbrd;

  function AddClipboardFormatListener(hWindow: HWND): BOOL; stdcall; external  User32;
  function RemoveClipboardFormatListener(hWindow: HWND): BOOL; stdcall; external  User32;

  const WM_CLIPBOARDUPDATE = $031D;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure GetData;
  protected
    procedure WndProc(var Message: TMessage); override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  AddClipboardFormatListener(Handle);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  RemoveClipboardFormatListener(Handle);
end;

procedure TForm1.GetData;
begin
  if Clipboard.HasFormat(CF_TEXT) then
    Memo1.Lines.Add(Clipboard.AsText);
end;

// Procesamos los mensajes a bajo nivel
procedure TForm1.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_CLIPBOARDUPDATE then
    GetData();
  
  inherited WndProc(Message);
end;

end.

Saludos.
Responder Con Cita
  #5  
Antiguo 06-11-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
escafandra,

Cita:
Empezado por escafandra
...Perfeccionando el visor del ClipBoard...Apropiado para S.O. Win2000 en adelante...En el caso de que nuestra aplicación sólo queramos que funcione desde Windows Vista, podemos optar por esta otra técnica, más sencilla pero que no funcionará en WinXP...


Nelson.
Responder Con Cita
  #6  
Antiguo 06-11-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Nelson, no entiendo tu cita

Saludos.
Responder Con Cita
  #7  
Antiguo 06-11-2014
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Es como el like de facebook.

// Saludos
Responder Con Cita
  #8  
Antiguo 06-11-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
escafandra,

Cita:
Empezado por escafandra
...no entiendo tu cita...


En resumen que tu código es muy interesante

Saludos,

Nelson.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
obtener el texto seleccionado de un Treeview ingabraham Varios 3 24-06-2011 16:36:03
font style a texto seleccionado pabloloustau Varios 2 08-04-2010 17:22:56
Detectar el item seleccionado en RadioButton santiago14 Varios 1 23-02-2010 16:37:11
Texto Seleccionado en un DbRichEdit johurgi Varios 1 03-11-2006 12:38:17
capturar texto no seleccionado, ComboBox sakuragi OOP 3 10-08-2005 23:28:22


La franja horaria es GMT +2. Ahora son las 18:01:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi