Windows剪切板操作


調用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,則分配固定內存,清零內存並直接返回指針

復制(向剪貼板內容)操作流程

一、創建一塊內存塊

  1. 分配一個適當大小的內存塊(GlobalAlloc, GHND)
  2. 鎖定它並獲得所有權(GlobalLock)
  3. 將要復制的內容拷貝到該內存
  4. 釋放內存的所有權(GlobalUnlock)

二、將剪切板內容設置為它
5. 打開剪貼板(OpenClipboard)
6. 清空剪貼板(EmptyCliboard)
7. 將該內存塊設為剪貼板的數據(SetClipboardData)
8. 關閉剪貼板(CloseClipboard)

粘貼(讀剪貼板內容)操作流程

  1. 打開剪貼板(OpenClipboard)
  2. 獲取包含剪貼板內容的內存塊句柄(GetClipboardData)
  3. 鎖定該內存塊並獲得指針(GlobalLock)
  4. 讀取該內存的內容
  5. 關閉剪貼板(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;     //返回成功
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM