Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Hook на буфер обмена

01.01.2007
{ 
 
*Just create a new form and call it ClipFormats.
 
*Drop a TButton and call it btnUpdate.
 
*Drop a TListBox and call it lbFormats.
 
 
Then just add the code below and hook up all the event handlers.
 
All it does is display all the formats currently on the clipboard and
  updates
as soon as the clipboard changes.
}
 
 unit
DynaClip;
 
 
interface
 
 uses
   
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
   
Dialogs, StdCtrls, ExtCtrls;
 
 type
   
TClipFormats = class(TForm)
     btnUpdate
: TButton;
     lbFormats
: TListBox;
     procedure
FormCreate(Sender: TObject);
     procedure
FormDestroy(Sender: TObject);
     procedure btnUpdateClick
(Sender: TObject);
   
private
     
{ Private declarations }
     
NextWindow: HWND;
     procedure
WMChangeCBChain(var Message: TWMChangeCBChain); message
     WM_CHANGECBCHAIN
;
     procedure
WMDrawClipboard(var Message: TWMDrawClipboard); message
     WM_DRAWCLIPBOARD
;
   
public
     
{ Public declarations }
   
end;
 
 
var
   
ClipFormats: TClipFormats;
 
 implementation
 
 
{$R *.DFM}
 
 procedure
TMDIChildClipFormats.FormCreate(Sender: TObject);
 
begin
   
NextWindow := SetClipboardViewer(Handle);
 
end;
 
 procedure
TClipFormats.FormDestroy(Sender: TObject);
 
begin
   
ChangeClipboardChain(Handle, NextWindow);
 
end;
 
 procedure
TClipFormats.WMChangeCBChain(var Message: TWMChangeCBChain);
 
begin
   
with Message do
   
begin
     
if (Remove = NextWindow) then
     
begin
       
NextWindow := Next;
     
end
     
else
     
begin
       
SendMessage(NextWindow, WM_CHANGECBCHAIN, Remove, Next);
     
end;
   
end;
 
end;
 
 procedure
TClipFormats.WMDrawClipboard(var Message: TWMDrawClipboard);
 
begin
   btnUpdate
.Click;
   
SendMessage(NextWindow, WM_DRAWCLIPBOARD, 0, 0);
 
end;
 
 procedure
TClipFormats.btnUpdateClick(Sender: TObject);
 
const
   
PreDefinedFormats: array[1..16] of string = ('CF_TEXT',
     
'CF_BITMAP',
     
'CF_METAFILEPICT',
     
'CF_SYLK',
     
'CF_DIF',
     
'CF_TIFF',
     
'CF_OEMTEXT',
     
'CF_DIB',
     
'CF_PALETTE',
     
'CF_PENDATA',
     
'CF_RIFF',
     
'CF_WAVE',
     
'CF_UNICODETEXT',
     
'CF_ENHMETAFILE',
     
'CF_HDROP',
     
'CF_LOCALE');
 
var
   
ClipFormat: TClipFormat;
   szBuffer
: array[0..511] of Char;
   
FormatID: string;
 
begin
   
if not OpenClipboard(Handle) then Exit;
   
try
     lbFormats
.Items.BeginUpdate;
     
try
       lbFormats
.Items.Clear;
 
       
ClipFormat := EnumClipboardFormats(0);
       
while (ClipFormat <> 0) do
       
begin
         
if (ClipFormat in [1..16]) then
         
begin
           
FormatID := PreDefinedFormats[ClipFormat];
         
end
         
else
         
begin
           
GetClipboardFormatName(ClipFormat, szBuffer, SizeOf(szBuffer));
           
FormatID := string(szBuffer);
         
end;
         lbFormats
.Items.Add(Format('%s [%d]', [FormatID, ClipFormat]));
         
ClipFormat := EnumClipboardFormats(ClipFormat);
       
end;
     
finally
       lbFormats
.Items.EndUpdate;
     
end;
   
finally
     
CloseClipboard;
   
end;
 
end;
 
 
end.

Взято с сайта: https://www.swissdelphicenter.ch