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

通常使うプリンタを取得する

通常使うプリンターを取得する方法をいくつか挙げる。 ①GetDefaultPrinter TCHAR printerName[1024]; DWORD dwBufferSize = 1024; BOO …

zipcopyの画面設計と動作仕様をまとめた

以下の課題について、まずは画面設計と画面設計をまとめた。 コピー元でzip圧縮後にネットワーク越しにファイルコピーしてコピー先で解凍するのを自動化できないか アプリ名はzipcopyとした。ググったと …

no image

プロパティシート

ソフト開発の話です。 私はVC6でソフトを作ってます。 ダイアログボックスの作りこみは、おもしろいものです。 プログラマーにとっては、デザイン的センスを問われる分野ですかね。 プロパティシートとは、ペ …

若いもんにC++を教えてやって、これまでやってきたことが少しでも伝わってくれればと願う夜

ファイルをセレクトするというC++で作ったActiveXのDLLのデバッグができないかと彼がおいらのところに来た時点で、そいつはなかなかチカラがあるなと感じた。