tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。