Delphiメモ

No023:クリップボードの中身を解析する

クリップボードの解析というわけだけど、
やってることはクリップボードの内容を列挙してID、フォーマット名をリストアップするって言うこと。
まず、フォーマットには2種類あって、あらかじめ定義されているものと独自形式のものがある。
定義済みのはWindowsユニット辺りに定数が乗っているので、それを判定に用いればいいだけ。
一方、独自形式はどうやって判定するのかというと、GetClipBoardFormatNameというAPIを用いる。
これも多分Windowsユニットに定義されている。
APIの定義は以下の通り。

function GetClipboardFormatName(format: Cardinal;
 lpszFormatName: PAnsiChar; cchMaxCount: Integer): Integer;

引数を説明すると、
formatにはクリップボードのフォーマットを指定する。
具体的にはClipBoard.Formats配列の1つ。
lpszFormatNameにはフォーマット名を格納する変数を指定する。
cchMaxCountはlpszFormatNameのサイズを指定すればいい。

とりあえず具体的な例を示してみる。
uses節にClipBrdを追加、フォームとリストビューを1つで、
NameはそれぞれForm1、ListView1とし、
vsReport形式でキャプションにフォーマットID(16進数)、
SubItems[0]にフォーマット名を記入する。

procedure TForm1.ProcessClipBoard;
var
  i: Integer;
  NewItem: TListItem;
  FormatID: Integer;
  FormatName: array [0..MAX_PATH] of Char;
begin
  //クリップボードの解析
  for i := 0 to ClipBoard.FormatCount - 1 do
  begin
    FormatID:= ClipBoard.Formats[i];
    NewItem:= ListView1.Items.Add;
    case ClipBoard.Formats[i] of
      CF_TEXT:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_TEXT');
      end;
      CF_BITMAP:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_BITMAP');
      end;
      CF_METAFILEPICT:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_METAFILEPICT');
      end;
      CF_SYLK:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_SYLK');
      end;
      CF_DIF:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_DIF');
      end;
      CF_TIFF:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_TIFF');
      end;
      CF_OEMTEXT:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_OEMTEXT');
      end;
      CF_DIB:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_DIB');
      end;
      CF_PALETTE:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_PALETTE');
      end;
      CF_PENDATA:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_PENDATA');
      end;
      CF_RIFF:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_RIFF');
      end;
      CF_WAVE:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_WAVE');
      end;
      CF_UNICODETEXT:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_UNICODETEXT');
      end;
      CF_ENHMETAFILE:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_ENHMETAFILE');
      end;
      CF_HDROP:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_HDROP');
      end;
      CF_LOCALE:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_LOCALE');
      end;
      CF_MAX:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_MAX');
      end;
      CF_MAX_XP:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_MAX_XP');
      end;
      CF_OWNERDISPLAY:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_OWNERDISPLAY');
      end;
      CF_DSPTEXT:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_DSPTEXT');
      end;
      CF_DSPBITMAP:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_DSPBITMAP');
      end;
      CF_DSPMETAFILEPICT:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_DSPMETAFILEPICT');
      end;
      CF_DSPENHMETAFILE:
      begin
        NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
        NewItem.SubItems.Add('CF_DSPENHMETAFILE');
      end
      else
      begin
        GetClipBoardFormatName(FormatID,FormatName,SizeOf(FormatName));
        NewItem.Caption:= IntToHex(FormatID,4);
        NewItem.SubItems.Add(FormatName);
      end;
    end;
  end;
end;

For文でFormatの個数分だけ回し、Case文でフォーマットを判定する。
定義済みに当たったら定義済みのフォーマット名を列挙する。
なお、IDはIntToHex関数で桁数4で文字列に変換する。
そして、もし定義済みに当たらなかったらGetClipBoardFormatNameの出番。
以下には実行画面を示す。

解析結果

TeraPadでコードの一部をコピーしたもの。
たかがテキストのコピーでも結構複雑なんだねぇ。

トップに戻る

関連ページ