在vb.net中使用unicode支持检测剪贴板文本更改

时间:2012-05-15 18:09:35

标签: vb.net unicode clipboard

我使用下面的代码来检查剪贴板中的文本更改,但不支持unicode chracters,如ابج有什么方法可以添加对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

1 个答案:

答案 0 :(得分:1)

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

  

指定标准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 ,例如:

{{1}}