VB6中剪切至剪貼板,粘貼unicode中文出現亂碼的解決方法
VB6設置了CF_TEXT(ANSI)內容到Clipboard中,對於ANSI軟件(如VB6中所用的TextBox控件)讀取它沒有問題;對於使用Unicode的軟件,則受限於做復制時的輸入法狀態,即當復制時輸入法為非中文(輸入法狀態欄顯示的是非CN,如EN)時,粘貼后出現中文亂碼。
解決的方法一是,在剪切時,先將輸入法設置在中文狀態時,既可簡單解決此問題。
第二是對Clipboard應用API編程
要進行剪切扣件的控件TEXT2中代碼如下:
Private Sub Text2_KeyPress(KeyAscii As Integer) If KeyAscii = 3 Then ' 是Ctrl C Dim bPaste As Boolean bPaste = ClipboardSetText(Me.hWnd, Text2.SelText) KeyAscii = 0 '取消 Ctrl + C, 避免進行剪切至剪貼板的自動操作 End If End Sub
參考代碼 http://www.xtremevbtalk.com/general/265879-clipboard-unicode.html
1 Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long 2 Private Declare Function SetClipboardData Lib "user32" (ByVal Format As Long, ByVal hMem As Long) As Long 3 Private Declare Function CloseClipboard Lib "user32" () As Long 4 Private Declare Function EmptyClipboard Lib "user32" () As Long 5 Private Declare Function GlobalAlloc Lib "kernel32" (ByVal Flags As Long, ByVal length As Long) As Long 6 Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long 7 Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long 8 Private Declare Sub RtlMoveMemory Lib "kernel32" (ByVal pDest As Long, ByVal pSource As Long, ByVal length As Long) 9 10 Private Const CF_UNICODETEXT = &HD& 11 Private Const GMEM_MOVEABLE = &O2& 12 Private Const GMEM_ZEROINIT = &O40& 13 14 ' hWnd 一般可用Me.HWnd,也可為0 15 ' StringToCopy = "Whatever blah blah blah" 16 Function ClipboardSetText(ByVal hWnd As Long, ByVal StringToCopy As String) As Boolean 17 Dim hMem As Long, pMem As Long 18 19 Call OpenClipboard(hWnd) 20 Call EmptyClipboard 21 22 hMem = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, LenB(StringToCopy)) 23 pMem = GlobalLock(hMem) 24 25 Call RtlMoveMemory(pMem, StrPtr(StringToCopy), LenB(StringToCopy)) 26 Call GlobalUnlock(hMem) 27 Call SetClipboardData(CF_UNICODETEXT, hMem) 28 Call CloseClipboard 29 End Function