不知道SetClipboardViewer 这个函数到底是什么功能
英文介绍也看不懂,程序也演示不出来!

解决方案 »

  1.   

    http://www.yesky.com/20000626/85986.shtmlhttp://ninputer.html.533.net/works.htmhttp://ninputer.html.533.net/message.htm
      

  2.   

    可以这么理解,通过这个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
    运行看看。