VB应用Windows api从剪贴板中获取HTML类型中文内容时有乱码产生
VB使用Windows api从剪贴板中获取HTML类型中文内容时有乱码产生
最近想写个程序来辅助完成日常工作。其中有个需求是,从网页上复制内容,包括表格、文字、图片等信息。所以,我就想到使用Windows api来监视剪贴板(程序代码1),并且来获取CF_HTML类型的数据,因为只有这样才能保留下表格相关信息等等。在编写过程中,我遇到了一个很难缠的问题,是关于UTF-8到Unicode编码问题。经查找已经有个解决方法(程序代码2)。但是经过测试,这个方法也不完善,在复制如(程序代码3)这样的奇数个汉字时会出现一个“?”(<P>中国?/P>)
因此,我特来向高手请教。有解决方法没,原因是什么?
程序代码1
最近想写个程序来辅助完成日常工作。其中有个需求是,从网页上复制内容,包括表格、文字、图片等信息。所以,我就想到使用Windows api来监视剪贴板(程序代码1),并且来获取CF_HTML类型的数据,因为只有这样才能保留下表格相关信息等等。在编写过程中,我遇到了一个很难缠的问题,是关于UTF-8到Unicode编码问题。经查找已经有个解决方法(程序代码2)。但是经过测试,这个方法也不完善,在复制如(程序代码3)这样的奇数个汉字时会出现一个“?”(<P>中国?/P>)
因此,我特来向高手请教。有解决方法没,原因是什么?
程序代码1
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Public Declare Function SetClipboardViewer Lib "user32" _
(ByVal hwnd As Long) As Long
Public Declare Function ChangeClipboardChain Lib "user32" _
(ByVal hwnd As Long, ByVal hWndNext As Long) As Long
Public Declare Function IsClipboardFormatAvailable Lib "user32" _
(ByVal wFormat As Long) As Long
Public Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" _
(ByVal lpString As String) As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpData As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pDest As Any, pSource As Any, ByVal cbLength As Long)
Public Declare Function MultiByteToWideChar Lib "kernel32" _
(ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, _
ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Public lpPrevWndProc As Long
Public lClipboardChain As Long
Public Const GWL_WNDPROC = -4
Public Const WM_DRAWCLIPBOARD = &H308
Public Const WM_CHANGECBCHAIN = &H30D
Public CF_HTML As Long
Public Const CP_UTF8 = 65001
Public Sub hook(hwnd As Long)
' 在这里使用了 AddressOf,得到的是WindowProc 函数的地址