クリップボードから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; } }