如何将文件放置到剪贴板里,以便在资源管理器或者其它地方进行粘贴?
我这里有一个子程序,可是有些时候行不通:    Public Function clipCopyFiles(Files() As String) As Boolean
     Dim data As String, df As DROPFILES, hGlobal As Long, lpGlobal As Long, i As Long
     '清除剪贴板中现存的数据
     If OpenClipboard(0&) Then
        Call EmptyClipboard
        data = data & vbNullChar
        For i = LBound(Files) To UBound(Files)
           data = data & Files(i) & vbNullChar
        Next i
        '为剪贴板拷贝操作分配相应大小的内存
        hGlobal = GlobalAlloc(GHND, Len(df) + Len(data))
        If hGlobal Then
            lpGlobal = GlobalLock(hGlobal)
            df.pFiles = Len(df)
            '将DropFiles结构拷贝到内存中
            Call CopyMem(ByVal lpGlobal, df, Len(df))
            '将文件全路径名拷贝到分配的内存中。
            Call CopyMem(ByVal (lpGlobal + Len(df)), ByVal data, Len(data))
            Call GlobalUnlock(hGlobal)
            '将数据拷贝到剪贴板上
            If SetClipboardData(CF_HDROP, hGlobal) Then clipCopyFiles = True
        End If
        Call CloseClipboard
     End If
    End Function请问高手:有没有其它可以解决该问题的办法?
完全解决的话再加分……
顶上也给分……

解决方案 »

  1.   

    http://www.codesky.net/article/doc/200309/2003090166217233.htm
      

  2.   

    http://www.codesky.net/article/doc/200309/2003090166217233.htm
    的代码我早就试过了,行不通!
    不过你说的可能有程序对剪贴板进行监视,这倒是的……我试着关闭那个剪贴板软件 试试……
      

  3.   

    直接調用系統的COPY菜單啊。
    用WINDOWS外殼編程嘛。
      

  4.   

    If IsClipboardFormatAvailable(CF_BITMAP) = 0 Then
            MsgBox "There was an error while pasting the bitmap to the clipboard!"
        End If
        'Close the clipboard
        CloseClipboard
    使用IsClipboardFormatAvailableAPI看看,有数据没有?
      

  5.   

    //还是不行,提示:无法复制文件:指定的文件名无效或太长。请指定另一文件名出现这种情况可以尝试将文件名转为短文件名:
    【VB声明】
      Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long【别名】
      GetShortPathNameA【说明】
      获取指定文件的短路径名 【返回值】
      Long,装载到lpszShortPath缓冲区的字符数量。如lpszShortPath的长度不足,不能容下文件名,就返回需要的缓冲区长度 【参数表】
      lpszLongPath ---  String,指定欲获取短路径名的那个文件的名字。可以是个完整路径,或者由当前目录决定  lpszShortPath --  String,指定一个缓冲区,用于装载文件的短路径和文件名  cchBuffer ------  Long,lpszShortPath缓冲区长度例子:
    Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As Long
    Public Function GetShortPath(strFileName As String) As String
        'KPD-Team 1999
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim lngRes As Long, strPath As String
        'Create a buffer
        strPath = String$(165, 0)
        'retrieve the short pathname
        lngRes = GetShortPathName(strFileName, strPath, 164)
        'remove all unnecessary chr$(0)'s
        GetShortPath = Left$(strPath, lngRes)
    End Function
    Private Sub Form_Load()
        MsgBox GetShortPath("c:\Program Files\")
    End Sub
      

  6.   

    如果其它程序已经执行了OpenClipboard,则其它程序不可修改剪贴板中的内容.必须先关闭可能使用OpenClipboard的程序,然后重新获得修改剪贴板的权限 :)
    如果文件名过长,则用rainstormmaster提供的方法获得8.3格式的文件名 ^-^
      

  7.   

    感谢 rainstormmaster(暴风雨 v2.0)网友不过我还是没有彻底解决问题!
    我的系统是XP_SP2的,不过我希望这个问题在任何系统里均可以!不知谁有现成的代码,适用于任何系统的!
    当然我现在在我的软件里是使用“复制到……”解决了,不用剪贴板直接调用拷贝!但希望这个问题能找到答案。
      

  8.   

    你先去除可能的干扰,照着:
    http://www.codesky.net/article/doc/200309/2003090166217233.htm
    一步步做完,还是不行的话,回帖