0

iamは、以下のコードを使用してクリップボードのテキストの変更をチェックしますが、ابجのような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.TextAnsiテキストのみをサポートします。ドキュメントには、次のようにも書かれています。

標準の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 に答える