Windows 10 1809の新機能「クリップボード履歴」はそこそこ使えるんだけど、惜しいんだよね。最大25個までのコピーした履歴を取れるところまではよいが、その履歴を一括でまとめて取得できないのだよ。なもんだから、おいらがそういうアプリを作ってやった。
Windows 10用アプリ「クリップボード履歴前取得」ダウンロード
例えば、クリップボードに以下の文字列が履歴として入っているとしよう。
最後
途中
最初
このアプリで「実行」ってやれば、以下のデータがクリップボードの1つ目に入る。
最初
途中
最後
つまり3回コピーした結果を、1回で貼り付けられるようにするということ。
アプリAとアプリBでコピペをくり返すのに、アプリA側でコピーする文字は規則性があってユーザーが指定する必要がある。一方で、アプリB側はシンプルにコピーした結果を貼り付ければよいという場合がある。「コピー&ペースト」を何度もやるのはダルいやな。アプリA側でコピーすることは省略できないのでひたすらコピーする。その後アプリB側でコピーした文字を一括でまとめて貼り付けられるようにしたいのだ。
アプリAがExcelで、アプリBがテキストエディターだとすれば想像しやすいだろうか。文字列をつなぐセパレーターは、初期値の改行以外にタブとカンマを指定できるようにした。
Visual Studio 2017 C#で作ったアプリ。クリップボード履歴を取得するためのコツがある。NuGetで「Microsoft.Windows.SDK.Contracts」を追加。これだけではビルドエラーになるので、ソリューションエクスプローラのpackages.configを右クリックして「packages.configをPackageReferenceに移行する」ってやればOK。あとは以下の記事をちょいとかじればできた。
クリップボードビューアを作ろう!~Windows 10 1809の新機能「クリップボード履歴」にアクセス
参考までに以下にソースコードを貼っておく。
using uwpDT = Windows.ApplicationModel.DataTransfer; namespace cbAllPaste { public partial class Form1 : Form { public Form1() { InitializeComponent(); comboBox1.Items.Add("改行"); comboBox1.Items.Add("タブ"); comboBox1.Items.Add("カンマ"); comboBox1.SelectedIndex = 0; } private async void button1_Click(object sender, EventArgs e) { if (!uwpDT.Clipboard.IsHistoryEnabled()) { MessageBox.Show("クリップボード履歴が有効になっていない", "エラー"); return; } string sep = ""; int pos = comboBox1.SelectedIndex; if (pos == 0) sep = "\r\n"; else if (pos == 1) sep = "\t"; else if (pos == 2) sep = ","; await GetClipboardHistoryAsync(sep); } public static async Task GetClipboardHistoryAsync(string sep) { // 履歴リストを取得する var result = await uwpDT.Clipboard.GetHistoryItemsAsync(); // 履歴の取得に失敗したときは、result.Statusに // Success以外(AccessDeniedまたはClipboardHistoryDisabled)が返される if (result.Status != uwpDT.ClipboardHistoryItemsResultStatus.Success) { MessageBox.Show("クリップボードにアクセスできない", "エラー"); return; } // 履歴のリストを取り出す IReadOnlyList<uwpDT.ClipboardHistoryItem> historyList = result.Items; // それぞれの履歴アイテムを処理する string strData = ""; uwpDT.ClipboardHistoryItem first = historyList.First(); foreach (uwpDT.ClipboardHistoryItem item in historyList.Reverse()) { // 履歴アイテムのIDとタイムスタンプ string id = item.Id; DateTimeOffset timestamp = item.Timestamp; // データのパッケージを取り出す(クリップボードのデータと同じ型) uwpDT.DataPackageView content = item.Content; // テキストデータを取り出す if (content.Contains(uwpDT.StandardDataFormats.Text)) { string textData = await content.GetTextAsync(); strData += textData; if (!item.Equals(first)) // 最後のセパレータは付けない strData += sep; } } if (string.IsNullOrEmpty(strData)) { MessageBox.Show("クリップボードが空", "エラー"); return; } // クリップボードをクリア uwpDT.Clipboard.ClearHistory(); // クリップボードに値をセット Clipboard.SetText(strData); MessageBox.Show("クリップボード履歴のテキストを全てまとめた上で、履歴クリア後に\r\n改めてクリップボードに設定しました。", "成功"); } } }