2009-04-16 65 views
10

我們開發了一個數據庫應用程序。用戶要求提供新功能:將Blob複製到剪貼板,以便Windows資源管理器可以將它們粘貼爲新文件。一種解決方案是將Blob保存到臨時文件夾中,並將這些臨時文件添加到剪貼板。如何將任意數據作爲文件複製到剪貼板?

但我正在尋找更好的解決方案。是否可以在Windows資源管理器中掛接粘貼操作,並自己將斑點保存到目標路徑?

回答

5

我想說瀏覽器不會複製到目標文件本身,所以沒有辦法直接編寫目標文件這很有意義,因爲源文件的名稱只能來自將數據複製到剪貼板的應用程序,而不必是資源管理器。OTOH目標文件的名稱可能實際上有所不同,因爲文件目標文件夾中可能已經存在相同的名稱,並且只有資源管理器可以爲目標文件創建修改後的名稱(例如,通過預先添加「副本」或者向基本文件名添加「(2)」)

您需要提供Windows資源管理器的剪貼板格式o它可以粘貼文件。 documentation of standard clipboard formats暗示CF _ HDROP是正確的。有了這個剪貼板格式,你可以提供一個源文件名列表,但是這些文件當然需要存在,所以你需要將它們保存到光盤。

儘管如此,您可以嘗試儘可能減輕重量。通常,當用戶將數據複製到剪貼板時,它會立即放入,無論它是否將用於粘貼操作。對於您的應用程序,這意味着您需要每次創建文件並將文件名列表放入剪貼板。但是,Windows確實支持稱爲Delayed Rendering的模式,該模式正好用於這種情況。基本上,你只把一個空的數據存根放到剪貼板上,只有當另一個應用程序試圖訪問你的應用程序請求的數據時。所以你可以用這種方式來實現,只有當用戶試圖將文件粘貼到資源管理器中時,纔會將它們保存到光盤並返回文件名列表。

1

這是一段時間,因爲我玩複製/粘貼,但我敢肯定,你可以做你的建議(將blob作爲一個新文件插入剪貼板)。

我似乎記得,根據您添加到剪貼板的方式,您可以指定要複製的數據類型。我認爲如果你的數據類型正確,你就可以粘貼,就像你從Windows資源管理器複製一樣。

我會嘗試和挖掘出一些更多的細節今天晚上,如果我有機會(我沒有我的一切都在這裏工作的書籤)...

[編輯]看一看the wxWidgets documentation on drag and drop。這就是我一直在努力的,它提供了關於數據類型的一些提示。

你在寫什麼?德爾福?

[編輯]我認爲這實際上可能是Windows(?)的限制。它可能只是wxWidgets文檔,但有a suggestion that you only copy filenames rather than the files themselves。如果是這樣的話,你將不得不使用你最初創建一個臨時文件的建議:-(

13

我從來沒有嘗試過,但我認爲這確實是可能的。請看看Shell Clipboard Formats的MSDN文檔。CFSTR_FILECONTENTSCFSTR_FILEDESCRIPTOR是您可能應該處理的格式。

此外,我在代碼項目中找到一篇文章,其中提供了一個演示程序:How to drag a virtual file from your app into Windows Explorer

更新: .NET編寫的一個例子:

+0

有趣的東西 - 謝謝你的鏈接:-) – 2009-04-16 14:36:52

+0

謝謝你,我也是。每天學些新東西! – 2009-04-16 16:59:51

7

從MSDN文章Handling Shell Data Transfer Scenarios

  • 現有文件應該以CF_HDROP格式提供。
  • 提供格式爲CFSTR_FILECONTENTS/CFSTR_FILEDESCRIPTOR 格式的文件類數據。該方法允許目標從數據 對象創建文件,而不需要知道關於基礎數據 存儲的任何內容。您通常應該將數據作爲IStream接口呈現爲 。這個 數據傳輸機制比全局內存對象更靈活 並使用更少的內存。其他

兩個很好的文章從MSDN閱讀是:

當我第一次開始使用剪貼板來傳輸文件工作,我打印關閉所有三篇文章並多次閱讀。

處理接口可能會涉及很多。我找到了兩個很好的庫來幫助解決這個問題。

The The Drag and Drop Component Suite for Delphi。如果您在主頁上向下滾動,您會看到一些常見問題解答很好。下載也有很多示例應用程序。我認爲AsyncSource演示應該對你正在尋找的東西有所幫助。該套件是免費的源代碼。代碼似乎很好評論。我正在使用Quasidata的[email protected]組件。它不是免費的,但非常便宜。我最初使用Transfer @ Once是因爲當時它比Drag and Drop組件套件支持的更好。但是,這種情況已經逆轉。 Transfer @ Once還不支持Delphi 2009。當我開始移動我的應用程序時,我可能會切換組件。購買時包含Transfer @ Once代碼。就我個人而言,我發現拖放代碼更易於閱讀和遵循。