Clipboard Spy

Clipboard Spy

Postby DarkByte » 01 Jun 2011, 21:43

V-ati gandit vreodata cat de limitat este Clipboard-ul ? Ce vreau sa spun e faptul ca, uneori, parca ai vrea sa poti copia mai multe bucati de text sau imagine si sa le poti accesa pe oricare dintre ele ... din pacate, Windows-ul nu permite asa ceva.

Totusi, am vazut programe care creaza un fel de "history" pe elementele copiate in clipboard si permit folosirea oricarui element dintr-o lista de maxim 5-10-20 de elemente. Cum se pot face asemenea programe ? E clar ca nu poti verifica o data la 200 ms si sa iti salvezi un nou element cu continutul clipboard-ului ... pentru ca, in majoritatea timpului, clipboard-ul va contine acelasi lucru ca si acum 5, 10 minute. OK... poti, verificand daca elementele sunt diferite intre ele ... dar exista o varianta mai buna.

Ce-ar fi sa ne anunte Windows-ul cand continutul clipboard-ului s-a modificat ? In felul asta nu trebuie decat sa folosim noul continut ... in orice fel dorim.

Programul de mai jos exemplifica modalitatea prin care clipboard-ul poate fi "spionat" si afiseaza continutul actual al clipboard-ului - numai daca este text sau imagine. Codul este relativ simplu si poate fi extins (destul de usor) pentru a ajunge la o functionalitate de multi-clipboard - dar nu acesta este scopul acestui post.

Un screenshot al programului - dupa ce am copiat o imagine si o bucatica de text:
Delphi clipboard, clipboard spy

Sursa completa si executabilul sunt in atasament.

Codul sursa este urmatorul:

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ExtCtrls, StdCtrls, Clipbrd;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     mmCB: TMemo;
  12.     imgCB: TImage;
  13.     procedure FormDestroy(Sender: TObject);
  14.     procedure FormCreate(Sender: TObject);
  15.   private
  16.     procedure WMDrawClipboard(var Msg: TMessage); message WM_DRAWCLIPBOARD;
  17.     procedure WMChangeCBChain(var Msg: TMessage); message WM_CHANGECBCHAIN;
  18.   public
  19.     function GetClipboardFormat: Integer;
  20.   end;
  21.  
  22. var
  23.   Form1: TForm1;
  24.   NextCB: THandle;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. function IsValidHandle(aHandle: THandle): Boolean;
  31. begin
  32.   Result := (aHandle <> 0) and (aHandle <> INVALID_HANDLE_VALUE);
  33. end;
  34.  
  35. function TForm1.GetClipboardFormat: Integer;
  36. begin
  37.   Result := CF_TEXT;
  38.   if Clipboard.HasFormat(CF_BITMAP) then
  39.     Result := CF_BITMAP;
  40. end;
  41.  
  42. procedure TForm1.WMDrawClipboard(var Msg:TMessage);
  43. begin
  44.   case GetClipboardFormat of
  45.     CF_TEXT:
  46.       begin
  47.         mmCB.Lines.Text := Clipboard.AsText
  48.       end;
  49.     CF_BITMAP:
  50.       begin
  51.         imgCB.Picture.Assign(Clipboard);
  52.       end;
  53.   end;
  54.  
  55.   if IsValidHandle(NextCB)
  56.     then SendMessage(NextCB, WM_DrawClipboard, 0, 0);
  57. end;
  58.  
  59. procedure TForm1.WMChangeCBChain(var Msg: TMessage);
  60. var
  61.   CBDelete, CBNext: THandle;
  62. begin
  63.   CBDelete := Msg.WParam;
  64.   CBNext := Msg.LParam;
  65.  
  66.   if NextCB = CBDelete
  67.     then NextCB := CBNext
  68.     else
  69.       if IsValidHandle(NextCB)
  70.         then SendMessage(NextCB, WM_ChangeCBChain, CBDelete, CBNext)
  71. end;
  72.  
  73. procedure TForm1.FormCreate(Sender: TObject);
  74. begin
  75.   NextCB := SetClipboardViewer(Self.Handle);
  76. end;
  77.  
  78. procedure TForm1.FormDestroy(Sender: TObject);
  79. begin
  80.   ChangeClipboardChain(Self.Handle, NextCB);
  81. end;
  82.  
  83. end.



Bafta si spor la programat :)
5p / 1 votes
Attachments
clip_spy_exe.zip
(201.19 KiB) Downloaded 26 times
clip_spy_src.zip
(6.19 KiB) Downloaded 19 times
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Return to Tutoriale Delphi

Who is online

Users browsing this forum: No registered users and 0 guests

cron