
開発環境
XP SP2
Visual Studio 2005
VC++
SDKのみ
クリップボードからテキストデータをコピーしたり、又はクリップボードへアップしたりということは、SDKを利用して簡単に行えます。
しかし、任意ファイルの読み書きとなると話が変わってきて、少なくともSDKのみを利用しようとした場合、参考となるWebPageがほとんどないように感じます。
MSDNの方でも、MFCユーザーを対象とした資料ばかりでした。
どなたか、指針を示して頂けないでしょうか。
目的は、
(1)任意ファイル(最低でもJPEG,GIF)をクリップボードに保存
(2)任意ファイルをクリップボードからコピー
です。
宜しくお願いします。
No.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 …
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様、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
バッチで118項目のCSVを処理し...
-
テキストファイルの最終行を削...
-
csvファイルを開かずに文字を検...
-
グローバル変数のよくない使い...
-
インターネットショートカット
-
ドラッグアンドドロップでファ...
-
VisualBasic.Netのフォーム上か...
-
ファイルクローズとメモリ使用...
-
fopenできる上限の変更
-
VBに、Cのincludeのようなもの...
-
ASP .NETでファイル選択ダイア...
-
union共同体の使い方…
-
UnicodeでないファイルをUnicod...
-
C#でEXCEL オープンできない
-
アプリケーション終了時例外エ...
-
効率の良い別のファイルのデー...
-
複数ファイルによる共通の外部...
-
マウスポインタの変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
dataファイルをxtxファイルにす...
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
グローバル変数のよくない使い...
-
バッチで118項目のCSVを処理し...
-
テキストファイルの最終行を削...
-
VBAにてEXCEL以外のファイル(テ...
-
VBに、Cのincludeのようなもの...
-
分割コンパイルの#defineについて
-
RPGでファイル名(もしくはレコ...
-
SGファイルって何ですか?
-
マウスポインタの変更
-
Excelマクロでの再読込み方法
-
【C#】リソースファイルの埋め...
-
ダイアログボックスで複数フォ...
-
C言語のfopenについて教えてく...
-
ドラッグアンドドロップでファ...
-
「VBScript」ADODB.Streamにお...
おすすめ情報