だらだらやるよ。

こげつのIT技術メモ

クリップボードからHTML形式のデータを取得する際の文字化け。

ここの話題
http://d.hatena.ne.jp/nagakura_eil/20070719
最終的なコードを乗せるのを忘れていたので一応載せておきます。
はっつけておきます。
未確認だけど、バイト配列を文字に変換している際に使用している文字コードを、うまい具合に自動判別して変更するようにすれば、どこのサイトでも文字化けせずに取得できるかしら:-)

	public class MyClipboard {
		[DllImport("user32.dll",SetLastError = true)]
		static extern IntPtr GetClipboardData(uint uFormat);
		[DllImport("user32.dll",SetLastError = true)]
		static extern bool OpenClipboard(IntPtr hWndNewOwner);
		[DllImport("user32.dll",SetLastError = true)]
		static extern bool CloseClipboard();
		[DllImport("user32.dll",SetLastError = true)]
		static extern uint RegisterClipboardFormatA(string lpszFormat);
		[DllImport("user32.dll",SetLastError = true)]
		static extern bool IsClipboardFormatAvailable(uint format);
		[DllImport("kernel32.dll",SetLastError = true)]
		static extern IntPtr GlobalLock(IntPtr hMem);
		[DllImport("kernel32.dll",SetLastError = true)]
		static extern uint GlobalSize(IntPtr hMem);
		[DllImport("kernel32.dll",SetLastError = true)]
		static extern IntPtr GlobalUnlock(IntPtr hMem);

		static public string GetHTMLFormatData(IntPtr handle) {
			uint CF_HTML = RegisterClipboardFormatA("HTML Format");

			if(!IsClipboardFormatAvailable(CF_HTML)) { return ""; }
			if(!OpenClipboard(handle)) { return ""; }
			IntPtr hGMem = GetClipboardData(CF_HTML);
			IntPtr pMFP = GlobalLock(hGMem);
			uint len = GlobalSize(hGMem);
			byte[] bytes = new byte[len];
			Marshal.Copy(pMFP,bytes,0,(int)len);

			string strMFP = System.Text.Encoding.UTF8.GetString(bytes);//UTF8固定
			GlobalUnlock(hGMem);
			CloseClipboard();
			return strMFP;
		}
	}