CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

クリップボード履歴を一括でまとめて取得したいだろ?

投稿日:

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

-ソフト開発

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

イテレータ(Iterator)

あるコンポーネントで初めて出会いました。コンポーネントがバージョンアップされたときに、オブジェクト指向的な作りに一新されて、いろいろ変わったのですが中でもイテレータという訳の分からないものに遭遇して、 …

no image

PDFiumでPDFを描画したりなんだりできるんだとさ

まずはこちらのネットニュースをご覧あれ。2014年に書かれたものでおもしろいことが書いてある。

Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(3)

vhdを手軽に圧縮できるPowerShellプログラムの決定版。 まずは、前回考えたことを振り返る。。 ps1内のvhdのファイルパスを自分で書き変えなきゃいけないのが難点だから、ps1と同じ場所にあ …

no image

軌道に乗ったか!?

 この11月の売り上げ本数が、10本の大台にのりました。私が最も力を入れているCAD関連ツールがです。喜ばしいことです。関係各位への感謝がつのります。  思えば半年前、あるユーザーの要望から始まったこ …

no image

フォルダ監視

フォルダを常時監視しておいて、ファイルが放り込まれたら、 自動的にファイル変換してくれたらよいね。 なんていう話があった。 一週間という短い間に、対象ソフトは別で2件あった。 こいつぁ、なんとかせにゃ …