Update:調整了順序,添加了詳細的過程介紹,修改了之前偷懶的程式碼
Windows下使用剪貼簿的過程大致如下:
複製的過程:
1. 初始狀態。
2. 程式A使用 OpenClipboard 開啟剪貼簿。此時剪貼簿被獨佔,無法被其他程式開啟。
3. 程式A使用 EmptyClipboard 清空剪貼簿。此時剪貼簿中原有的資料被清除。
4. 程式A使用 GlobalAlloc 申請一段用於存放資料的全域性記憶體。
5. 程式A使用 GlobalLock、GlobalUnlock 設定全域性記憶體中的資料。
6. 程式A使用 SetClipboardData 將全域性記憶體的控制代碼設定到剪貼簿。
7. 程式A使用 CloseClipboard 關閉剪貼簿。此時剪貼簿的佔用被解除,其他程式可以訪問剪貼簿。程式A關閉後剪貼簿中依然有資料。
貼上的過程:
2. 程式B使用 OpenClipboard 開啟剪貼簿。
3. 程式B使用 GetClipboardData 獲取剪貼簿中全域性記憶體的控制代碼。
4. 程式B使用 GlobalLock、GlobalUnlock 獲取全域性記憶體中的資料。
5. 程式B使用 CloseClipboard 關閉剪貼簿。
實際上,當你在檔案管理器中使用“複製”的時候,並不會真正地將整個檔案複製到剪貼簿中,只是將檔案的路徑存放在了剪貼簿中(型別為 CF_HDROP,簡單地說是一個檔案列表),當然也不會消耗多少時間。當你“貼上”的時候,檔案管理器才會真正地複製這個檔案。
舉例來說,你可以透過下面的程式碼來檢視當前剪貼簿中剛剛“複製”了的檔案(C++11程式碼):
效果(隨便選了一些檔案):
Update:調整了順序,添加了詳細的過程介紹,修改了之前偷懶的程式碼
Windows下使用剪貼簿的過程大致如下:
複製的過程:
1. 初始狀態。
2. 程式A使用 OpenClipboard 開啟剪貼簿。此時剪貼簿被獨佔,無法被其他程式開啟。
3. 程式A使用 EmptyClipboard 清空剪貼簿。此時剪貼簿中原有的資料被清除。
4. 程式A使用 GlobalAlloc 申請一段用於存放資料的全域性記憶體。
5. 程式A使用 GlobalLock、GlobalUnlock 設定全域性記憶體中的資料。
6. 程式A使用 SetClipboardData 將全域性記憶體的控制代碼設定到剪貼簿。
7. 程式A使用 CloseClipboard 關閉剪貼簿。此時剪貼簿的佔用被解除,其他程式可以訪問剪貼簿。程式A關閉後剪貼簿中依然有資料。
貼上的過程:
1. 初始狀態。
2. 程式B使用 OpenClipboard 開啟剪貼簿。
3. 程式B使用 GetClipboardData 獲取剪貼簿中全域性記憶體的控制代碼。
4. 程式B使用 GlobalLock、GlobalUnlock 獲取全域性記憶體中的資料。
5. 程式B使用 CloseClipboard 關閉剪貼簿。
實際上,當你在檔案管理器中使用“複製”的時候,並不會真正地將整個檔案複製到剪貼簿中,只是將檔案的路徑存放在了剪貼簿中(型別為 CF_HDROP,簡單地說是一個檔案列表),當然也不會消耗多少時間。當你“貼上”的時候,檔案管理器才會真正地複製這個檔案。
舉例來說,你可以透過下面的程式碼來檢視當前剪貼簿中剛剛“複製”了的檔案(C++11程式碼):
效果(隨便選了一些檔案):