高分求助大虾,现在小弟想写个这样的程序,后台监测用户对文件的复制,粘贴两个操作,并且记录被复制粘贴文件的文件名,路径,时间!
小弟先谢了

解决方案 »

  1.   

    创建新工程。
    首先在Form1添加以下代码:
    Private Sub Form_Load()
        'Subclass this form
        HookForm Me
        'Register this form as a Clipboardviewer
        SetClipboardViewer Me.hwnd
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'Unhook the form
        UnHookForm Me
    End Sub
    然后在工程中添加一个模块,在其中加入以下代码:
    Private Type POINTAPI
        x As Long
        y As Long
    End Type
    Private Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As String
    End Type
        
    Declare 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
    Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
      Declare Function CloseClipboard Lib "user32" () As Long
      Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) _
       As Long
      Declare Function GlobalAlloc Lib "kernel32" ( _
       ByVal wFlags As Long, ByVal dwBytes As Long) As Long
      Declare Function SetClipboardData Lib "user32" ( _
       ByVal wFormat As Long, ByVal hMem As Long) As Long
      Declare Function EmptyClipboard Lib "user32" () As Long
      Declare Function RegisterClipboardFormat Lib "user32" Alias _
       "RegisterClipboardFormatA" (ByVal lpString As String) As Long
      Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) _
       As Long
      Declare Function GlobalUnlock Lib "kernel32" ( _
       ByVal hMem As Long) As Long
      Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
       pDest As Any, pSource As Any, ByVal cbLength As Long)
      Declare Function GetClipboardData Lib "user32" ( _
       ByVal wFormat As Long) As Long
      Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" ( _
       ByVal lpData As Long) As Long
    Declare Function DragQueryFile Lib "shell32.dll" Alias _
         "DragQueryFileA" (ByVal hDrop As Long, ByVal UINT As Long, _
         ByVal lpStr As String, ByVal ch As Long) As Long
        Private Declare Function DragQueryPoint Lib "shell32.dll" (ByVal _
         hDrop As Long, lpPoint As POINTAPI) As LongPublic Const WM_DRAWCLIPBOARD = &H308
    Public Const GWL_WNDPROC = (-4)
    Dim PrevProc As Long
    Const CF_HDROP = 15
    Const MAX_PATH As Long = 260Public 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
        Private Function TrimNull(ByVal StrIn As String) As String
            Dim nul As Long
            nul = InStr(StrIn, vbNullChar)
            Select Case nul
            Case Is > 1
            TrimNull = Left(StrIn, nul - 1)
            Case 1
            TrimNull = ""
            Case 0
            TrimNull = Trim(StrIn)
            End Select
        End Function
        
    Public Function GetFileClipboard() As String
        Dim sData As String
        Dim hDrop As Long
        Dim nFiles As Long
        Dim i As Long
        Dim desc As String
        Dim filename As String
        Dim pt As POINTAPI
        Dim tfStr As SHFILEOPSTRUCT
        Dim Files() As String    If CBool(OpenClipboard(0)) Then        Dim hMemHandle As Long, lpData As Long
            Dim nClipSize As Long      
            hDrop = GetClipboardData(CF_HDROP)
            '获得文件数
            nFiles = DragQueryFile(hDrop, -1&, "", 0)
          
            ReDim Files(0 To nFiles - 1) As String        Dim strAllFile As String
            
            filename = Space(MAX_PATH)
            For i = 0 To nFiles - 1
            '根据获取的每一个文件执行文件拷贝操作
               Call DragQueryFile(hDrop, i, filename, Len(filename))
               Files(i) = TrimNull(filename)
               
               strAllFile = strAllFile + Files(i)
               strAllFile = strAllFile + "|"
            Next i        GetFileClipboard = strAllFile
            Call CloseClipboard
        End IfEnd FunctionPublic 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
            'MsgBox "Clipboard changed ..."
            
            If (IsClipboardFormatAvailable(CF_HDROP)) Then
                Debug.Print GetFileClipboard
            End If
        End If
    End Function然后运行,拷贝两个文件,然后在Debug窗口中就可以列出拷贝的文件了,文件用|分割。拷贝的时间就是当前时间。
      

  2.   

    关键字:IShellExecuteHook
    例:记录外壳的活动    记录外壳活动有很多好处,比如当需要监控用户的行为,回溯系统崩溃前的过程。实现这一功能的关键工具相当简单,它就是COM接口IShellExecuteHook。编写一个实现了这一接口的COM对象后,再在系统中注册,就可以容易地控制并影响Windows外壳的运行。Windows 98和Windows 2000都支持IShellExecuteHook外壳扩展,而在Windows 95和Windows NT 4.0上则必须安装活动桌面扩展后才支持(也就是说必须安装IE 4.01)。    一个实现了IShellExecuteHook接口的COM对象可以截获所有对ShellExecute和ShellExecuteEx函数的调用。ShellExecute和ShellExecuteEx函数主要用于执行应用程序,它们可以接收一个文件名并能自动获得同文件名相关的可执行文件名。此外,它们还支持系统安全认证。如果在NT上设定了用户的可执行权限,ShellExecute和ShellExecuteEx函数将会在创建新的进程前检查权限(CreateProcess和WinExec函数则没有这项功能)。函数调用的流程如下:    (1) 获得将要运行的可执行文件名。    (2) 根据程序名检查用户执行权限。    (3) 激活全部已注册的IShellExecuteHook扩展。    (4) 当所有扩展和权限都同意执行,创建新的进程并返回。
        Windows外壳大量调用ShellExecute和ShellExecuteEx函数来执行几乎是所有的资源管理器的操作,比如双击目录、浏览文件夹内容、打印编辑文档、查看文件属性、选择文档的上下文相关菜单等等。此外,开始菜单的运行对话框和DOS方式下的Start.exe也使用ShellExecuteEx函数来执行程序。简单地说几乎用户的所有外壳操作都可以被扩展截获,包括其他应用程序对ShellExecute和ShellExecteEx的调用。 
      

  3.   

    如果是拷贝目录的话可以通过实现ICopyHook接口来实现,
    http://www.applevb.com/sourcecode/ICopyHook.zip
    实现了这个接口,参考压缩文件中的readme.txt