braintag

公開してしまう備忘録

C#.NETにてクリップボードイベントの取得

クリップボードに何かコピーされたときに、イベントをキャッチする。
まずはフォームの定義に追加

public class Form1 : System.Windows.Forms.Form
{
	<code class=a>[DllImport("User32.dll")]
	protected static extern int	SetClipboardViewer(int hWndNewViewer);
	[DllImport("User32.dll", CharSet=CharSet.Auto)]
	public static extern bool ChangeClipboardChain(IntPtr hWndRemove,IntPtr hWndNewNext);
	[DllImport("user32.dll", CharSet=CharSet.Auto)]
	public static extern int SendMessage(IntPtr hwnd, int wMsg,IntPtr wParam,IntPtr lParam);
	IntPtr nextClipboardViewer;</code>

次はコンストラクタに以下を追加

public Form1()
{
	InitializeComponent();
	<code class=a>nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle);</code>

次はDispose()に追加

protected override void Dispose( bool disposing )
{
	<code class=a>ChangeClipboardChain(this.Handle, nextClipboardViewer);</code>

そしてWndProc()を追加し、

protected override void WndProc(ref Message m)
{
	const int WM_DRAWCLIPBOARD = 0x308;
	const int WM_CHANGECBCHAIN = 0x030D;
	switch(m.Msg)
	{
		case WM_DRAWCLIPBOARD:
			ClipBoardのイベント関数();
			SendMessage(nextClipboardViewer, m.Msg, m.WParam,m.LParam);
			break;
		case WM_CHANGECBCHAIN:
			if (m.WParam == nextClipboardViewer)
				nextClipboardViewer = m.LParam;
			else
				SendMessage(nextClipboardViewer, m.Msg, m.WParam,m.LParam);
			break;
		default:
			base.WndProc(ref m);
			break;
	}
}

これで終了。
Ctrl+Cとかやると、ClipBoardのイベント関数();が実行される。