タイトル : Re: クリップボードデータの文字化けについて 投稿日 : 2009/05/19(Tue) 09:02 投稿者 : take
えいるさんのサイトを参考にさせていただきました。 http://d.hatena.ne.jp/nagakura_eil/20071019/1192765159 下のコードはサイトのC#をVBに変換しています。 コードがすべて適切に変換されているか、良くわかりませんが、動作させると文字化けはなくなりました。 ただ、ちょっと疑問点があります。 半角スペースが続くと”?”に変換されます。これは半角スペースに置換して対応しようと思います。 また、DataObjectにSetDataする際に”DataFormats.Text”形式でしないとうまくいきません。”DataFormats.Html”では文字化けします。”DataFormats.Text”でSetDataするとExcelの形式を選択して貼り付けで、HTML形式は出てこないで、UnicodeTextとTextになり、UnicodeTextで貼り付けるとうまくいきます。 えいるさんにはお忙しい中、とても親切に対応していただきました。 また、皆様ありがとうございました。 Friend ClipD As Object Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try Dim MyClip As New MyClipboard ClipD = MyClip.GetHTMLFormatData(Nothing) Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Try Dim SetClipData As New DataObject SetClipData.SetData(DataFormats.Text, False, ClipD) 'Textフォーマットで書くと正しくHtmlが出力される? Clipboard.Clear() Clipboard.SetDataObject(SetClipData, True) Catch ex As Exception MsgBox(ex.Message) End Try End Sub Public Class MyClipboard Declare Function GetClipboardData Lib "user32.dll" (ByVal uFormat As UInt32) As IntPtr Declare Function OpenClipboard Lib "user32.dll" (ByVal hWndNewOwner As IntPtr) As Boolean Declare Function CloseClipboard Lib "user32.dll" () As Boolean Declare Function RegisterClipboardFormatA Lib "user32.dll" (ByVal lpszFormat As String) As UInt32 Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal format As UInt32) As Boolean Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As IntPtr) As IntPtr Declare Function GlobalSize Lib "kernel32.dll" (ByVal hMem As IntPtr) As UInt32 Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As IntPtr) As IntPtr Function GetHTMLFormatData(ByVal handle As IntPtr) As String GetHTMLFormatData = "" Try Dim CF_HTML As UInt32 = RegisterClipboardFormatA("HTML Format") If IsClipboardFormatAvailable(CF_HTML) = False Then Return "" If OpenClipboard(handle) = False Then Return "" Dim hGMem As IntPtr = GetClipboardData(CF_HTML) Dim pMFP As IntPtr = GlobalLock(hGMem) Dim len As UInt32 = GlobalSize(hGMem) Dim bytes As Byte() ReDim bytes(len) Marshal.Copy(pMFP, bytes, 0, len) Dim strMFP As String = System.Text.Encoding.UTF8.GetString(bytes) 'UTF8固定 GlobalUnlock(hGMem) CloseClipboard() GetHTMLFormatData = strMFP Catch ex As Exception MsgBox(ex.Message & " GetHTMLFormatData") End Try End Function End Class |