可以这么理解,通过这个api可以然其他窗口控件检视剪贴板的变化,为什么呢,当你调用 SetClipboardViewer object.hwnd 后剪贴板发生变化时object会接受到WM_DRAWCLIPBOARD消息,这样通过捕捉这个消息你就可以达到检视剪贴板的目的。举个例子: 我在Form_Load中调用 SetClipboardViewer Me.hwnd 那么当系统剪贴板发生变化,我的form就可以收到WM_DRAWCLIPBOARD消息。 但是因为VB默认的窗口处理过程没有处理它,我们如果想处理它就必须通过子类化的手段重新处理消息: 在模块中粘贴下面代码: Option ExplicitDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Declare Function SetClipboardViewer Lib "user32" (ByVal hwnd As Long) As Long Public Const WM_DRAWCLIPBOARD = &H308 Public Const GWL_WNDPROC = (-4) Dim PrevProc As Long Public Sub HookForm(F As Form) PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc) End Sub Public Sub UnHookForm(F As Form) SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc End Sub Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) If uMsg = WM_DRAWCLIPBOARD Then Form1.Text1.Text = Clipboard.GetText End If End Function好该定义的都定义好了,我们来看看效果: 窗体中:Private Sub Form_Load() HookForm Me SetClipboardViewer Me.hwnd End Sub Private Sub Form_Unload(Cancel As Integer) UnHookForm Me End Sub Private Sub Command1_Click() Clipboard.Clear Clipboard.SetText "Hello !" End Sub 运行看看。
SetClipboardViewer object.hwnd
后剪贴板发生变化时object会接受到WM_DRAWCLIPBOARD消息,这样通过捕捉这个消息你就可以达到检视剪贴板的目的。举个例子:
我在Form_Load中调用
SetClipboardViewer Me.hwnd
那么当系统剪贴板发生变化,我的form就可以收到WM_DRAWCLIPBOARD消息。
但是因为VB默认的窗口处理过程没有处理它,我们如果想处理它就必须通过子类化的手段重新处理消息:
在模块中粘贴下面代码:
Option ExplicitDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetClipboardViewer Lib "user32" (ByVal hwnd As Long) As Long
Public Const WM_DRAWCLIPBOARD = &H308
Public Const GWL_WNDPROC = (-4)
Dim PrevProc As Long
Public Sub HookForm(F As Form)
PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(F As Form)
SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
If uMsg = WM_DRAWCLIPBOARD Then
Form1.Text1.Text = Clipboard.GetText
End If
End Function好该定义的都定义好了,我们来看看效果:
窗体中:Private Sub Form_Load()
HookForm Me
SetClipboardViewer Me.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHookForm Me
End Sub
Private Sub Command1_Click()
Clipboard.Clear
Clipboard.SetText "Hello !"
End Sub
运行看看。