MFCプログラミング(3):
クリップボードへのデータ形式の登録

2021年4月10日

どもです。
今回も、クリップボードネタです。

1.背景(簡単に)

アプリケーションにコピー機能を実装する際に、アプリケーション独自のデータ内容をコピーする機能が要求されました。
デフォルトで定義されているデータ形式では対応できなかったので、新たなデータ形式を定義する必要が出てきました。

2.対応

新たなデータ形式の「登録」そのものは、ものすごく簡単でした。

UINT RegisterClipboardFormatA(
          LPCSTR lpszFormat
        );

MSDN

引数:lpszFormatに、新しいデータ形式の名前を設定します。
処理が成功した場合には、データ形式に対応する値が返ります。
また、すでにデータ形式が登録されていた場合も、その形式に対応する値が返ります。
処理が失敗した場合には、「0」が返ります。

一度登録すれば、毎回同じ値が得られます。

3.問題点

3.1.環境依存

上記関数を使用して、同じデータ形式名を指定しても、(PCの)環境によっては異なる値が得られる(かもしれない)可能性があります。
そのため、実装の際に#defineしたり定数で持たせたり、ということができません。
設計などで対応する余地は十二分にありますが、状況によっては問題/課題になる可能性があります。

3.2.書き込み/読み出しは別

上記関数で登録できたのは、データ形式の名前「のみ」です。
そのため、登録したデータ形式に対応するデータをクリップボードに実際に書き込む処理、データ形式、フォーマットについては独自に設計しなければなりません。
その辺の情報については、「C++オブジェクト 直列化」などのキーワードで調べていただければよいかと思います。

4.まとめ

今回は、クリップボードにアプリケーション独自のデータ形式を登録することができる、という内容について書きました。
ただ、あくまで「データ形式を登録するだけ」なので、クリップボードにデータを書き込む、データを読み出す際のデータフォーマットや処理については別途定義/設計する必要があるので、注意が必要です。

ではっ!