どんな機能なのか?
Windowsの機能
Windowsのクリップボード履歴の機能は、おおむね次の図のようになっています。従来のクリップボードはそのままに、履歴とそれを管理する仕組みを追加した形です。
アプリがクリップボードへコピーするところ(①)は、従来と変わりありません。クリップボードの履歴が有効になっていると、引き続いて次のような処理が行われるように機能が追加されました。なお、数字②~④は、その順番で処理されるという意味ではありません。
-
②条件を満たすデータを履歴に:
テキスト/HTMLまたはビットマップに変換できるデータで、一定サイズ以下のものを、クリップボードからコピーして履歴の先頭へ挿入します -
③条件を満たすデータをローミング:
自動ローミングが有効になっている場合は、一定サイズまでのテキストデータをローミングします -
④上限量を超えたデータを削除:
履歴の件数またはデータ量が一定量を超える場合は、その上限に収まるまで履歴の末尾からデータを削除します(ピン留めしたものを除く)
すべてのデータがクリップボードの履歴に入るわけではないですし、上限も履歴の件数だけではないので、なかなか予想しにくい動きをしてくれます。②で履歴に入るサイズの上限は、テキストと画像で違います。画像の上限サイズは内部で圧縮して保持しているサイズによるようで、元のファイルサイズともクリップボードから得られる画像データのサイズとも違います。④で削除されるときのデータ量の計算も、テキストと画像で分かれているようです。削除される履歴も1つとは限らず、新しい履歴が入るようになるまで何個でも削除されます。サイズの大きな画像をコピーしたら履歴の後ろの方がごっそり消えてしまい、最初は何が起きたのかと思いました。このWindowsのクリップボード履歴の機能について、詳しくは「クリップボード (Windows 10 バージョン 1809 の新機能) - マイクロソフト コミュニティ」が参考になります。
このクリップボードの履歴には、「はじめに」で紹介したように、[Windows]キー+[V]キーを押すと立ち上がるポップアップでアクセスできます。そこで述べたように、履歴の閲覧や削除だけでなく、ピン留めと手動でのローミングも可能です。
APIの機能
Windows 10 1809のSDKで提供されているAPIは、おおむね次の図のようになっています。クリップボードにアクセスするAPIは、従来からあったものです。1809では、履歴にアクセスするAPIが追加されました。図中にはメソッド名/イベント名だけを示してありますが、すべてClipboardクラス(Windows.ApplicationModel.DataTransfer名前空間)のものです。
APIでは、履歴の閲覧や削除のほかに、履歴の1つをクリップボードに戻すこともできます。残念ながら今のところ、履歴のピン留めと手動ローミングを行う機能は提供されていません。
クリップボードの履歴にアクセスするためのAPI
1809でClipboardクラスに追加された履歴関係のAPIは、次の通りです。
-
履歴を取得する:GetHistoryItemsAsyncメソッド
取得に成功したかどうかの結果と、履歴アイテムのリストが返ってきます -
履歴を削除する:ClearHistory/DeleteItemFromHistoryメソッド
ClearHistoryメソッドは、履歴リストの全てのアイテムを削除します。
DeleteItemFromHistoryメソッドは、履歴リストの中から指定したアイテムだけを削除します -
履歴をクリップボードへコピーする:SetHistoryItemAsContentメソッド
指定した履歴アイテムをコピーしてクリップボードに戻します。次にエンドユーザーが貼り付け操作をすると、その指定した履歴アイテムが貼り付けられることになります -
変更通知を受け取る:HistoryChanged
/HistoryEnabledChanged/RoamingEnabledChangedイベント
履歴リストに変更があるとHistoryChangedイベントが、また、履歴/履歴のローミングの有効/無効が切り替えられるとHistoryEnabledChanged/RoamingEnabledChangedイベントが発生します -
状態を取得する:IsHistoryEnabled/IsRoamingEnabledメソッド
履歴/履歴のローミングの有効/無効状態を調べられます(上の図には載っていません)
なお、UWPアプリからクリップボードの内容/履歴にアクセスする際には、セキュリティー上の制約が掛かります。UWPアプリがアクティブ(アプリのウインドウが表示されていてフォーカスを持っている状態)のときしかアクセスできませんので、ご注意ください。この制限は、従来のデスクトップアプリ(Windows FormsやWPFなど)には適用されません。
