2

私は次のトリックをしようとしています:

  1. クリップボードにIDataObject*セットする必要があるので、クリップボードにセットするために使用OleSetClipboard()しています。
  2. CLIPFORMATクリップボードに追加したいものがもう1つありますが、受け取ったメソッドが実装されていないOleSetClipboard()ため、追加できません。したがって、この制限を克服するために、この方法で、最初にクリップボードに移動することはできません。IDataObject*SetData()OpenClipboard()GetClipboardOwner()SetClipboardData()EmptyClipboard()

これですべて正常に機能しますが、OleGetClipboard()を使用してクリップボードに配置したデータが返されない場合はSetClipboardData()、を使用できGetClipboardData()ます。

なぜこれが起こるのか想像できます(それは単にを返しますIDataObject*)、それで私はOleFlushClipboard()を削除しようとしましたIDataObject*、そしてOleGetClipboard()再びOSに新しいを再構築させようとしましたIDataObject*、そしてそれはまだCLIPFORMATによって追加されたものを含んでいませんでしたSetClipboardData()

誰かがこの問題を克服する方法を知っていますか?または別のトリック?またはそれがこのように機能する理由を説明しますか?ありがとう

4

1 に答える 1

1

これを(Windows 7で)試したところ、動作しているように見えますが、クロスプロセスのみです。

  • クリップボードの所有者とは別のプロセスで、OleGetClipboardは、すべての形式(つまり、データオブジェクトの元の形式とクリップボードに追加された追加の形式)を含むデータオブジェクトを返します。
  • 同じプロセスで、OleGetClipboardは常に、余分なクリップボード形式を含まないデータオブジェクトを返します。

どちらの場合も、OleFlushClipboardを呼び出しても違いはありません。

とにかく、これはひどく堅牢なソリューションのようには見えません。代わりにできることは、認識している形式に応答し、他の形式を元のデータオブジェクトに委任する独自のデータオブジェクトを作成することです。EnumFormatEtcメソッドは、両方のオブジェクトのフォーマットを組み合わせます。 この記事には、拡張可能な単純なデータオブジェクトのスケルトンが含まれています。

于 2012-09-20T09:27:47.830 に答える