SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

クリップボードビューアを作ろう!
~Windows 10 1809の新機能「クリップボード履歴」にアクセス

UWPアプリ開発の最前線 第10回

どんな機能なのか?

Windowsの機能

 Windowsのクリップボード履歴の機能は、おおむね次の図のようになっています。従来のクリップボードはそのままに、履歴とそれを管理する仕組みを追加した形です。

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
クリップボードとクリップボード履歴にアクセスするAPI

クリップボードの履歴にアクセスするためのAPI

 1809でClipboardクラスに追加された履歴関係のAPIは、次の通りです。

  • 履歴を取得する:GetHistoryItemsAsyncメソッド
    取得に成功したかどうかの結果と、履歴アイテムのリストが返ってきます
  • 履歴を削除する:ClearHistoryDeleteItemFromHistoryメソッド
    ClearHistoryメソッドは、履歴リストの全てのアイテムを削除します。
    DeleteItemFromHistoryメソッドは、履歴リストの中から指定したアイテムだけを削除します
  • 履歴をクリップボードへコピーする:SetHistoryItemAsContentメソッド
    指定した履歴アイテムをコピーしてクリップボードに戻します。次にエンドユーザーが貼り付け操作をすると、その指定した履歴アイテムが貼り付けられることになります
  • 変更通知を受け取る:HistoryChanged
    HistoryEnabledChangedRoamingEnabledChangedイベント
    履歴リストに変更があるとHistoryChangedイベントが、また、履歴/履歴のローミングの有効/無効が切り替えられるとHistoryEnabledChanged/RoamingEnabledChangedイベントが発生します
  • 状態を取得する:IsHistoryEnabledIsRoamingEnabledメソッド
    履歴/履歴のローミングの有効/無効状態を調べられます(上の図には載っていません)

 なお、UWPアプリからクリップボードの内容/履歴にアクセスする際には、セキュリティー上の制約が掛かります。UWPアプリがアクティブ(アプリのウインドウが表示されていてフォーカスを持っている状態)のときしかアクセスできませんので、ご注意ください。この制限は、従来のデスクトップアプリ(Windows FormsやWPFなど)には適用されません。

次のページ
クリップボード履歴を取得する

この記事は参考になりましたか?

UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11229 2018/12/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー