Public Class RichEditBox
Inherits System.Windows.Forms.RichTextBox
<DllImport("User32.dll")> _
Private Shared Function SetClipboardViewer(ByVal hWndNewViewer As IntPtr) As IntPtr
End Function
<DllImport("User32.dll")> _
Private Shared Function ChangeClipboardChain(ByVal hWndRemove As IntPtr, ByVal hWndNewNext As IntPtr) As Boolean
End Function
<DllImport("user32.dll")> _
Private Shared Function SendMessage(ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function
Private Const WM_DRAWCLIPBOARD As Integer = &H308
Private Const WM_CHANGECBCHAIN As Integer = &H30D
Public Event ChangeClipboard As EventHandler
Private nextClipboardViewer As IntPtr = IntPtr.Zero
Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
MyBase.OnHandleCreated(e)
Me.nextClipboardViewer = SetClipboardViewer(Me.Handle)
End Sub
Protected Overrides Sub OnHandleDestroyed(ByVal e As System.EventArgs)
ChangeClipboardChain(Me.Handle, Me.nextClipboardViewer)
MyBase.OnHandleDestroyed(e)
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_DRAWCLIPBOARD
RaiseEvent ChangeClipboard(Me, New EventArgs)
SendMessage(Me.nextClipboardViewer, m.Msg, m.WParam, m.LParam)
Case WM_CHANGECBCHAIN
If Me.nextClipboardViewer.Equals(m.WParam) Then
Me.nextClipboardViewer = m.LParam
Else
SendMessage(Me.nextClipboardViewer, m.Msg, m.WParam, m.LParam)
End If
Case Else
MyBase.WndProc(m)
End Select
End Sub
End Class