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改めてクリップボードに設定しました。", "成功");
}
}
}