Windows剪贴板
剪贴板(ClipBoard)是内存中的一块区域,是Windows内置的一个非常有用的工具,通过小小的剪贴板,架起了一座彩桥,使得在各种应用程序之间,传递和共享信息成为可能。然而美中不足的是,剪贴板只能保留一份数据,每当新的数据传入,旧的便会被覆盖。
相关Windows API
最主要的是SetClipboardViewer,每当剪贴板的内容发生变化时,该函数通过WM_DRAWCLIPBOARD消息将窗口加入被通知的窗口链。
由于剪贴板观察器链中下一个窗口的句柄还没有返回,应用程序不应传递它在SetClipboardViewer
调用过程中接收到的WM_DRAWCLIPBOARD消息。
如果要从剪贴板观察器链中去掉窗口链,则应用程序必须调用ChangeClipboard成员函数。
- 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
wndproc函数
操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过GetMessage等方法最终将消息提交到窗口过程(WndProc[英文全称windows process])指向一个应用程序定义的窗口过程的指针。
- 'Override WndProc to get messages...
- Protected Overrides Sub WndProc(ByRef m As Message)
- Select Case m.Msg
- Case Is = WM_DRAWCLIPBOARD 'The clipboard has changed...
- '##########################################################################
- ' Process Clipboard Here :)........................
- '##########################################################################
- SendMessage(mNextClipBoardViewerHWnd,m.Msg,m.WParam,m.LParam)
- '显示剪贴板中的文本信息
- If Clipboard.ContainsText() = True Then
- Label1.Text = Clipboard.GetText()
- End If
- '显示剪贴板中的图片信息
- If Clipboard.ContainsImage() = True Then
- PictureBox1.Image = Clipboard.GetImage()
- PictureBox1.Update()
- 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.LParam)
- End If
- End Select
- MyBase.WndProc(m)
- End Sub
效果: