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)
-
-
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()
-
-
-
If Clipboard.ContainsImage() = True Then
-
PictureBox1.Image = Clipboard.GetImage()
-
-
-
-
Case Is = WM_CHANGECBCHAIN 'Another clipboard viewer has removed itself...
-
If m.WParam = CType(mNextClipBoardViewerHWnd, IntPtr) Then
-
mNextClipBoardViewerHWnd = m.LParam
-
-
SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam)
-
-
-
-
-
效果:

源码下载:VB.NET实现Windows剪贴板监视器
http://download.csdn.net/detail/testcs_dn/8299111