SHOEISHA iD

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

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

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

UWPアプリ開発の最前線

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

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

UWPの制約に対処する

 以上で、クリップボードの履歴を取得するClipboardHistoryData.TryUpdateAsync静的メソッドが出来ました。このメソッドは、まずアプリの初期化時に呼び出します。さて、その後は、いつ呼び出せばよいでしょう? ClipboardクラスにはHistoryChangedイベントがあって、履歴の変化を監視できます。このイベントを受けてTryUpdateAsync静的メソッドを呼び出せばよさそうです。

 実際、従来のデスクトップアプリでは、クリップボードへのアクセスに制限はないので、HistoryChangedイベントハンドラーでTryUpdateAsync静的メソッドを呼び出すだけでよいです(WPFのMainWindow.xaml.cs)。

 ところが、UWPアプリでは、クリップボードへアクセスできるのはアプリがアクティブになっているときだけです。アプリのウインドウが表示されていて、フォーカスを持っている状態でないと、アクセスできないのです。

 そこで、UWPアプリでは、HistoryChangedイベントハンドラーでTryUpdateAsync静的メソッドを呼び出してみますが、履歴が取得できなかったらフラグを立てておいて、後でウインドウがアクティブになったときに改めてTryUpdateAsync静的メソッドを呼び出すようにします(次のコード、MainPage.xaml.cs)。

UWPの制約に対処する
// 履歴取得失敗のフラグ
bool notGetClipboardHistoryYet = false;

// クリップボードの履歴に変化があったとき
// ※ ウインドウにフォーカスがないと取得に失敗する⇒フラグを立てておく
Clipboard.HistoryChanged += async (s, e) =>
{
  if (await Data.ClipboardHistoryData.TryUpdateAsync()
        != ClipboardHistoryItemsResultStatus.Success)
    notGetClipboardHistoryYet = true;
};

// ウインドウがアクティブになったとき
// ※ 取得失敗のフラグが立っていたら、取得してみる⇒成功したらフラグを倒す
CoreWindow.GetForCurrentThread().Activated += async (s, e) =>
{
  if (notGetClipboardHistoryYet)
  {
    if (await Data.ClipboardHistoryData.TryUpdateAsync()
          == ClipboardHistoryItemsResultStatus.Success)
      notGetClipboardHistoryYet = false;
  }
};

 また、HistoryChangedイベントの他にも、HistoryEnabledChangedイベント(クリップボード履歴の利用可否が切り替えられたとき)とRoamingEnabledChangedイベント(クリップボードのローミングの利用可否が切り替えられたとき)でも履歴リストの内容が変化した可能性があるので、同じように対処します。なお、クリップボードそのものの内容の変化を監視するContentChangedイベントでも同様にします。

 あとは、ClipboardHistoryData.Itemsコレクションを画面にデータバインディングしてやれば、アプリをクリックするなどしてアクティブにしたときに、履歴の表示が更新されるようになります(次の画像)。なお、Visual Studioからデバッグ実行しているときには、アクティブでなくてもクリップボードのデータが取れてしまうので、テストするときには気を付けてください。

サンプルアプリ
サンプルアプリ(再掲、赤枠内が履歴を表示している部分)

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

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー