コンソールアプリケーションでクリップボードを使う

コンソールアプリケーションは「新しいプロジェクトの作成」で作成したままでは、クリップボードを使うプログラムを開発することができません。DOS時代のプログラムには、文字列や画像のコピー&ペーストなどの考え方がなかったからでしょう。

ということで、コンソールアプリケーションに Windows 風味の機能を有したライブラリを明示追加してビルドする必要があります。

そのライブラリは System.Windows.Forms です、Windows Forms アプリケーションでは当然のごとく最初から参照されていますが、コンソールアプリケーションの場合はユーザがこれを明示して参照しなくてはなりません。

ここから明示参照する手順を示します。

Fig. 1 のように Ctrl + Alt + L のショートカットキーなどを使って、VisualStudio のソリューションエクスプローラ―を表示します。

現在のプロジェクトの「参照」を右クリックして「参照の追加(R)...」を選びます。

Fig. 1 System.Windows.Forms を参照する前の状態

Fig. 2 の構成マネージャーのダイアログが表示されます。「アセンブリ」をクリックします。

リストのなかから System.Windows.Forms を選びます。選んだだけではいけません、チェックボックスにチェックを入れてください。

チェックを入れたら、下部の [OK] ボタンを押します。

Fig. 2 構成マネージャーで System.Windows.Forms を選んでチェックをいれる

ソリューションエクスプローラーに、参照前には表示されていなかった System.Windows.Forms が追加されていることを確認してください。これが Fig. 3 になります。

先ほどチェックを入れなかった場合は、ここに表示されませんので、やりなおしてください。

Fig. 3 System.Windows.Forms が参照された状態

下記にソースコードを示します。クリップボードを扱う場合に必要な記述がひとつだけあります。

[STAThread]

という記述がそれです。

MSDNの技術解説には下記のような場合は必ずこの記述を明示せよとのことです。

  • クリップボードを扱う場合
  • 「ファイルを開く」や「ファイルを保存」などのコモンダイアログボックスを扱う場合
  • ドラッグアンドドロップなどのシステム機能を扱う場合

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace aaa
{
	class Program
	{
		[STAThread] // 必ず追加せよ.
		static void Main( string [] args )
		{

			// 現在の年月日時分秒を取得する.
			DateTime dtm = DateTime.Now;

			// 年月日時分秒の文字列を生成する.
			int Y4 = dtm.Year;
			int M2 = dtm.Month;
			int D2 = dtm.Day;
			int h2 = dtm.Hour;
			int m2 = dtm.Minute;
			int s2 = dtm.Second;
			int n3 = dtm.Millisecond;
			const String FMT = "{0:d4}/{1:d2}/{2:d2}_{3:d2}:{4:d2}:{5:d2}.{6:d3}";
			String str = String.Format( FMT, Y4, M2, D2, h2, m2, s2, n3 );

			// クリップボードに文字列を送りこむ.
			System.Windows.Forms.Clipboard.SetText( str );

			Console.WriteLine( str );
			Console.Write( "push any key to quit. > " );
			Console.ReadKey();

		}
	}
}