調用WinAPI實現剪切板操作的函數:
BOOL OpenClipboard(HWND hWndNewOwner); //打開剪切板
BOOL EmptyClipboard(VOID); //清空剪切板
HANDLE SetClipboardData(UINT uFormat, HANDLE hMem); //設置剪切板內容
HANDLE GetClipboardData(UINT uFormat); //返回剪切板內容的內存塊句柄
BOOL CloseClipboard(); //關閉剪切板
常用的剪切板數據類型(還包括很多其它類型,詳情可參考MSDN)
CF_TEXT //一段ANSI文本
CF_OEMTEXT //一段DOS文本
CF_UNICODETEXT //一段Unicode文本
CF_LOCALE //區域標識
CF_BITMAP //位圖
CF_DIB //設備無關位圖
需要使用Win32內存塊與剪貼板交互,常用Win32內存塊操作函數(另有LocalAlloc等,功能完全相同):
HGLOBAL GlobalAlloc(分配選項, 分配內存大小); //分配全局內存並返回它的句柄或指針
HGLOBAL GlobalFree(內存塊句柄); //釋放全局內存
SIZE_T GlobalSize(內存塊句柄); //返回全局內存的大小
LPVOID GlobalLock(內存塊句柄); //獲得全局內存所有權,並返回指向全局內存的指針
BOOL GlobalUnlock(內存塊句柄); //釋放全局內存所有權,GlobalAlloc分配選項如果是GHND,則分配可變內存,清零內存並返回全局內存句柄,需要GlobalLock以獲取指針
//GlocalAlloc分配選項如果是GPTR,則分配固定內存,清零內存並直接返回指針
復制(向剪貼板內容)操作流程:
一、創建一塊內存塊
- 分配一個適當大小的內存塊(GlobalAlloc, GHND)
- 鎖定它並獲得所有權(GlobalLock)
- 將要復制的內容拷貝到該內存
- 釋放內存的所有權(GlobalUnlock)
二、將剪切板內容設置為它
5. 打開剪貼板(OpenClipboard)
6. 清空剪貼板(EmptyCliboard)
7. 將該內存塊設為剪貼板的數據(SetClipboardData)
8. 關閉剪貼板(CloseClipboard)
粘貼(讀剪貼板內容)操作流程:
- 打開剪貼板(OpenClipboard)
- 獲取包含剪貼板內容的內存塊句柄(GetClipboardData)
- 鎖定該內存塊並獲得指針(GlobalLock)
- 讀取該內存的內容
- 關閉剪貼板(CloseClipboard)
實例代碼:
bool CopyTextToClipboard(const char *text)
{
int i = 0, j = 0;
for (; i < 6; i++)
{
//打開剪切板
j = OpenClipboard(NULL);
//判斷是否打開成功,如果打開失敗則重新嘗試5次
if (j == 0 && i < 5)
Sleep(60);
if (j == 0 && i == 5)
return false;
if (j != 0)
{
i = 0;
j = 0;
break;
}
}
//分配字節數,HGLOBAL表示一個內存塊
HGLOBAL hmem = GlobalAlloc(GHND, strlen(text) + 1);
//鎖定內存中指定的內存塊,並返回一個地址值令其指向內存塊的起始處
char *pmem = (char *)GlobalLock(hmem);
//清空剪切板並釋放剪切板內數據的句柄
EmptyClipboard();
memcpy(pmem, text, strlen(text) + 1);
SetClipboardData(CF_TEXT, hmem); //寫入數據
CloseClipboard(); //關閉剪切板
GlobalFree(hmem); //釋放內存塊
return true; //返回成功
}
