アプリ版:「スタンプのみでお礼する」機能のリリースについて

開発環境
XP SP2
Visual Studio 2005
VC++
SDKのみ

クリップボードからテキストデータをコピーしたり、又はクリップボードへアップしたりということは、SDKを利用して簡単に行えます。
しかし、任意ファイルの読み書きとなると話が変わってきて、少なくともSDKのみを利用しようとした場合、参考となるWebPageがほとんどないように感じます。
MSDNの方でも、MFCユーザーを対象とした資料ばかりでした。
どなたか、指針を示して頂けないでしょうか。
目的は、
(1)任意ファイル(最低でもJPEG,GIF)をクリップボードに保存
(2)任意ファイルをクリップボードからコピー
です。
宜しくお願いします。

A 回答 (1件)

★任意ファイルの形式について


・任意のファイル形式を処理するにはクリップボードのデータ形式を調べる必要があります。
>(1)任意ファイル(最低でもJPEG,GIF)をクリップボードに保存
 ↑
 JPEG と GIF ですか?
 定義済みの形式は CF_TEXT、CF_BITMAP、CF_WAVE、CF_RIFF、CF_TIFF などなどです。
・クリップボードのデータ形式は EnumClipboardFormats() 関数で列挙できるようです。
 あと複数のデータ形式をサポートするには GetPriorityClipboardFormat() 関数で
 利用できるデータ形式を調べてからクリップボードの取得(コピー)する必要があります。
 下にサンプルを載せておきます。

サンプル:
// クリップボード内の複数のデータ形式を調べる
UINT uFormat[] = {
 CF_BITMAP,
 CF_TEXT,
 CF_WAVE,
 CF_RIFF,
 CF_TIFF,
}; LPCTSTR lpMsg;

switch ( GetPriorityClipboardFormat(uFormat,5) ){
 case CF_BITMAP: lpMsg = TEXT("CF_BITMAP形式です"); break;
 case CF_TEXT: lpMsg = TEXT("CF_TEXT形式です"); break;
 case CF_WAVE: lpMsg = TEXT("CF_WAVE形式です"); break;
 case CF_RIFF: lpMsg = TEXT("CF_RIFF形式です"); break;
 case CF_TIFF: lpMsg = TEXT("CF_TIFF形式です"); break;
 case 0: lpMsg = TEXT("クリップボードが空です"); break;
 case -1: lpMsg = TEXT("指定のデータ形式以外です"); break;
 default: lpMsg = TEXT("不明なデータ形式です"); break;
}
MessageBox( hWnd, lpMsg, TEXT("調査"), (MB_ICONASTERISK|MB_OK) );

解説:
・上記のサンプルではテキスト、ビットマップ(BMP)、WAVE形式、RIFF形式、TIFF形式の5つを
 サポートする場合です。ただし、この5つは定義済みの形式です。
 定義済みではない独自の形式(JPEG,GIF)などは RegisterClipboardFormat() 関数で
 新しいデータ形式を文字列で Windows に登録して、GetClipboardFormatName() 関数で
 データ形式の文字列を取得したりします。なお新しいデータ形式を登録すると UINT 型で
 識別 ID コードみたいなのが返されます。この値を使って JPEG、GIF などのデータ形式を
 識別します。CF_TEXT、CF_BITMAP のように定義済みではないので登録者で管理する訳。

まとめ:
・(1)RegisterClipboardFormat() 関数で独自の JPEG、GIF データ形式を登録。
 (2)GetClipboardFormatName() 関数で登録した JPEG、GIF データ形式を取得可能。
 (3)EnumClipboardFormats() 関数で利用可能なデータ形式を列挙可能。
 (4)GetPriorityClipboardFormat() 関数でクリップボード内のデータ形式を調査可能。
 以上の関数を利用して任意ファイルのデータ形式を自分で用意してやり取りを行います。
 ※詳しい解説は MSDN マニュアルを参照のこと。
・以上。データ形式の列挙に関しては下の『参考URL』をどうぞ。

参考URL:http://nienie.com/~masapico/api_EnumClipboardFor …
    • good
    • 0
この回答へのお礼

Oh-Orange様
毎度お答え頂きありがとうございます。

EnumClipboardFormats()関数による利用可能なデータ形式列挙は、私も以前調べて知ってはいたのですが、出力されてくるフォーマット形式の文字列のみ判明することに不満を持っていました。
例えばjpegファイルをこの関数で調査すると、

DataObject
Shell IDList Array
CF_HDROP
DataObjectAttributes
Preferrede DropEffect
Shell Object Offsets
FileName
FileNameW
Ole Private Data

と、出力されてきます。CF_HDROPは標準実装で調べれば資料は簡単に見つかりますが、その他に関しては中々調査しづらくて困りました。
また、標準実装のCF_...の各フォーマットに関しても、MSDNや他のWebPageの資料の説明では不十分に感じられました。私が力不足なだけでしょうけれど。

本題ですが、任意ファイルをクリップボードから取得することは、ほぼ巧くいきそうです。
昨日から調査と実験を繰り返し、Oh-Range様からのヒントも活用したところ、先ほどクリップボードに保存されている任意ファイルのコピー元パスを取得することに成功致しました。

EnumClipboardFormats()関数で列挙したフォーマットの内、CF_HDROPに注目したところ、CF_HDROPはエクスプローラのファイルやフォルダをドラッグした場合に扱われるらしいということが判明致しました。
http://www5a.biglobe.ne.jp/~sage-p/public_vml/dr …

後は簡単で、クリップボードからデータを取得する際の手順を踏み、GetClipboardData()の戻り値で得たハンドルをHDROPに変換し、DragQueryFile()に渡すことでコピー元ファイルのファイルパスを獲得できました。
この後は、パスから元データを獲得してもよいし、クリップボードから取得してもOK。

Oh-Range様、ありがとうございました。

お礼日時:2007/08/16 11:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!