今更ながら、C#でクリップボードの実装をしました。
PDICみたいなクリップボード監視できないかなあ?とG先生に聞いてみたところ、下記サイトがありました。OSZありがたい
http://www.k4.dion.ne.jp/~anis7742/codevault/00130.html
早速委譲アダプタで実装です。
でも「Disposal必須」だそうで注意が必要です。
MyClipComboBox.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace ABCS.UserClass { public class MyClipComboBox : ComboBox, IDisposable { //クリップボード監視 private ClipBoardWatcher cbwAdapter; public MyClipComboBox() : base() { this.cbwAdapter = new ClipBoardWatcher(); this.cbwAdapter.DrawClipBoard += (sender, e2) => { if (Clipboard.ContainsText()) { //this.listBox1.Items.Add(Clipboard.GetText()); String clipText = Clipboard.GetText(); if (!this.Items.Contains(clipText)) { this.Items.Add(clipText); } this.SelectedItem = clipText; //this.SelectedText = clipText; } }; } protected override void Dispose(bool disposing) { this.cbwAdapter.Dispose(); base.Dispose(disposing); } } }
Disposal管理にヘルパーを実装。
単純なシングルトンです〜。
MyDisposalHelper.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ABCS.UserClass { public class MyDisposalHelper { private static ListshouldDisposes = new List (); private static MyDisposalHelper singleton = new MyDisposalHelper(); MyDisposalHelper() { } public static MyDisposalHelper GetMyDisposalHelper() { return MyDisposalHelper.singleton; } public static void Add(IDisposable objDisposal ) { MyDisposalHelper.shouldDisposes.Add(objDisposal); } public static void DoDispose() { foreach (IDisposable disposal in MyDisposalHelper.shouldDisposes) { disposal.Dispose(); } } } }
でメインフォームのOnLoadとOnClosingに下記記述を・・・
Form1.cs
private void Form1_Load(object sender, EventArgs e) { //最後にdispose するオブジェクトの登録 MyDisposalHelper.Add(this.cmbClipText); } private void frmMain_FormClosing(object sender, FormClosingEventArgs e) { //クリップボード解放 //this.cmbClipText.Dispose(); MyDisposalHelper.DoDispose(); }