0

我使用下面的代码来检查剪贴板中的文本更改,但它不支持像 ا ب ج 这样的 unicode 字符有没有办法添加对 unicode 文本的支持,或者有没有其他方法可以做同样的工作?

#Region " Definitions "
    'Constants for API Calls...
    Private Const WM_DRAWCLIPBOARD As Integer = &H308
    Private Const WM_CHANGECBCHAIN As Integer = &H30D
    'Handle for next clipboard viewer...
    Private mNextClipBoardViewerHWnd As IntPtr
    'API declarations...
    Declare Auto Function SetClipboardViewer Lib "user32" (ByVal HWnd As IntPtr) As IntPtr
    Declare Auto Function ChangeClipboardChain Lib "user32" (ByVal HWnd As IntPtr, ByVal HWndNext As IntPtr) As Boolean
    Declare Auto Function SendMessage Lib "User32" (ByVal HWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Long
#End Region

#Region " Contructor "
#End Region

#Region " Message Process "
    'Override WndProc to get messages...
    Protected Overrides Sub WndProc(ByRef m As Message)
        Dim iData As IDataObject = New DataObject()
        iData = Clipboard.GetDataObject()
        Select Case m.Msg

            Case Is = WM_DRAWCLIPBOARD 'The clipboard has changed...
                '##########################################################################
                ' Process Clipboard Here :)........................
                '##########################################################################
                MsgBox(CStr(iData.GetData(DataFormats.Text)))
                SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam)

            Case Is = WM_CHANGECBCHAIN 'Another clipboard viewer has removed itself...
                If m.WParam = CType(mNextClipBoardViewerHWnd, IntPtr) Then
                    mNextClipBoardViewerHWnd = m.LParam
                Else
                    SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam)
                End If
        End Select

        MyBase.WndProc(m)
    End Sub
#End Region

#Region " Dispose "
    'Form overrides dispose to clean up...
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            'Set the next clipboard viewer back to the original... 
            ChangeClipboardChain(Me.Handle, mNextClipBoardViewerHWnd)
            MyBase.Dispose(disposing)
        End If
    End Sub
4

1 回答 1

1

您的代码无法检测到 Unicode 文本的更改,因为它不是在寻找 Unicode 文本格式。Ansi 和 Unicode 使用不同的剪贴板格式,它们可以同时在剪贴板上共存。 DataFormats.Text仅支持 Ansi 文本。文档甚至说了这么多:

指定标准 ANSI 文本格式

您需要寻找DataFormats.UnicodeText代替或补充的DataFormats.Text,例如:

Protected Overrides Sub WndProc(ByRef m As Message) 
    Select Case m.Msg 
        Case Is = WM_DRAWCLIPBOARD 'The clipboard has changed... 
            '########################################################################## 
            ' Process Clipboard Here :)........................ 
            '########################################################################## 
            Dim iData As IDataObject = Clipboard.GetDataObject() 
            Dim oData as Object = iData.GetData(DataFormats.Text)
            If oData IsNot Nothing
              MsgBox(CStr(oData), MsgBoxStyle.OKOnly, "Ansi") 
            End If
            oData = iData.GetData(DataFormats.UnicodeText)
            If oData IsNot Nothing
              MsgBox(CStr(oData), MsgBoxStyle.OKOnly, "Unicode") 
            End If

        Case Is = WM_CHANGECBCHAIN 'Another clipboard viewer has removed itself... 
            If m.WParam = CType(mNextClipBoardViewerHWnd, IntPtr) Then 
                mNextClipBoardViewerHWnd = m.LParam 
            Else 
                SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam) 
            End If 
    End Select 

    MyBase.WndProc(m) 
End Sub 
于 2012-05-18T02:31:11.220 回答