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

iTextSharpによるPDFファイルのページ分割

iTextSharpはフリーのPDF関連コンポーネントであり、いろんなことができるのは知っていた。ドットNET、つまりC#かVB使いであれば、けっこう簡単にPDFを操ることができるのだが、あいにくおい …

no image

WM_TIMER

MFCで時間を扱うための基本的なメッセージ。 プログラムの10年以上やってるけど、今まで必要なかった。 必要性を感じて調べたら、けっこうおもしれぇ。 データ変換に要している時間を、ダイアログボックス内 …

no image

Microsoft Visual C++ 2015 Redistributable

C言語のプラグラマなもんで、MFCなんていう今や時代遅れなプラットフォームを使っている。VC6の時代は長かったが、その後VC8(VS2005)に上げて

Teigha改めODAでDWGをDXFに変換するプログラムをつくってみよう!【Part.2】

Part.1ではあれこれと前提の話を書いたわけだが、今回は実際にVCのプロジェクトを作る準備をしてみよう。 1.ODAモジュールのダウンロード 2019 Update 2のKernelとDrawing …

PDFに捺印したけりゃコレ使え「PDFアレコレ」

こんな感じでPDFに捺印したいことはよくある。 Adobe Readerでもできるんだけど、ちゃんとした印鑑を押そうとするとかなりタイヘン。 【Acrobat Reader】PDFで簡単に電子印鑑する …