2017-06-12 253 views
1

我想將二進制文件複製到剪貼板,因此當用戶右鍵單擊屏幕時可以看到粘貼選項啓用。軟件很好地處理粘貼部分,只需要將文件複製到剪貼板。 這是我第一次與剪貼板工作我想這個代碼將文件複製到剪貼板

Procedure CopyStreamToClipboard(fmt: Cardinal; S: TStream); 
    Var 
    hMem: THandle; 
    pMem: Pointer; 
    Begin 
    S.Position := 0; 
    hMem := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size); 
    If hMem <> 0 Then Begin 
     pMem := GlobalLock(hMem); 
     If pMem <> Nil Then Begin 
     try 
      S.Read(pMem^, S.Size); 
      S.Position := 0; 
     finally 
      GlobalUnlock(hMem); 
     end; 
     Clipboard.Open; 
     try 
      Clipboard.SetAsHandle(fmt, hMem); 
     finally 
      Clipboard.Close; 
     end; 
     End { If } 
     Else Begin 
     GlobalFree(hMem); 
     OutOfMemoryError; 
     End; 
    End { If } 
    Else 
     OutOfMemoryError; 
    End; 

這是不工作的IM不知道,但我猜,因爲即時通訊傳遞給方法

CopyStreamToClipboard(CF_HDROP, fileStream); 

我想把手的其也可以使用SetClipboardData,但找不到任何有用的示例。謝謝

回答

6

CF_HDROP格式不能容納實際的文件數據,只有文件名。閱讀MSDN的更多細節文檔中關於CF_HDROP

Shell Clipboard Formats

對於你正在嘗試做的,你將需要:

  1. TStream數據保存到臨時文件,然後使用CF_HDROP將該文件名放在剪貼板上。使用CFSTR_FILEDESCRIPTORCFSTR_FILECONTENTS而不是CF_HDROP。然後,您可以爲您的數據提供一個IStream(請參閱RTL的TStreamAdapter課程,以在IStream實施內包裝TStream)。但是,您無法通過SetClipboardData()來執行此操作,因此您需要實現IDataObject接口,並將其與OleSetClipboard()一起使用。有關詳細信息,請參閱MSDN:

    Shell Data Object

    Handling Shell Data Transfer Scenarios

  2. 使用RegisterClipboardFormat()註冊自定義的剪貼板格式,那麼你可以存儲任何你想要在剪貼板上,包括整個文件(這是不可取的儘管)將大量的數據放在剪貼板上)。但是,在調用GetClipboardData()來訪問您的自定義數據時,另一個粘貼數據的應用程序也必須使用RegisterClipboardFormat()

無論哪種方式,已顯示的代碼是唯一適合作爲-爲#3。

+0

非常感謝你,幫助我很多,因爲我現在沒有關於剪貼板的想法,現在我知道它是如何工作的,所以我會檢查應用程序,看看它是如何處理粘貼數據,然後我可以決定哪個我要將文件複製到剪貼板 –