windows下的剪切板編程詳解
要使用剪切板就要了解剪切板的幾個函數 ?

BOOL EmptyClipboard(VOID); //清空剪切板并且釋放與剪切板相關的數據的句柄
BOOL OpenClipboard( HWND hWndNewOwner ); //打開剪切板并且阻止其他應用程序 修改剪切板的內容 hwnd為當前打開窗體的句柄
HGLOBAL GlobalAlloc( UINT uFlags, SIZE_T dwBytes ); //在全局堆分配一塊內存,Windows內存管理器不提供單獨的全局對和本地堆 ,這個函數比起他內存 函數慢,但是這個函數仍然在剪切板等應用中使用。 有人可能會問了,為什么不用new或者 malloc呢? 那是因為你的new和malloc所分配的空間只是在一個進程中分配的,它并不能被Windows下所有進程所共享 。
(*)他返回的不是一個內存塊的指針,而是一個內存對象的句柄 。 我們可以通過GloabalLock()獲得內存指針,。。。
LPVOID GlobalLock( HGLOBAL hMem); //鎖定一個內存對象,并且返回指向這個內存對象的第一個字節的指針 。 對于可移動的內存對象來說,其內部的數據結構包含一個計數器,GlobalLock會是這個計數器+1 ,GlobalUnLock使這個計數器-1 。 鎖定的內存塊將不會被 移動或者丟棄 除非調用了GlobalReAlloc函數 .每次調用完一個GlobalLock函數 對應調用GlobalUnLock函數 。
BOOL GlobalUnlock( HGLOBAL hMem ); 減少GMEM_MOVEABLE類型內存對象的鎖定計數,對于GMEM_FIXED類型的內存對象沒有影響
BOOL CloseClipboard(VOID); //當一個應用程序使用完剪切板應該調用這個函數 關閉剪切板,允許其他程序訪問 剪切板 。HANDLE SetClipboardData( UINT uFormat, HANDLE hMem ); //將指定的內存對象的數據 設置到剪切板 。
HANDLE GetClipboardData( UINT uFormat ); //從剪切板獲得指定的數據,這個函數調用前 剪切板必須被打開 。
BOOL IsClipboardFormatAvailable(UINT format); //檢測剪切板中是否有指定格式的數據函數介紹完了下面就是應用 :
1、向剪切板中增加數據 ,這里我用文本做示范 、
::OpenClipboard(m_hWnd) ;// 打開剪切板 防止其他 進程第剪切板操作 EmptyClipboard() ;//清空剪切板 并且將權限附加到 打開剪切板的窗體 HANDLE h=GlobalAlloc(GMEM_FIXED,100) ; //在全局堆分配內存并且返回句柄 char *p=(char*) GlobalLock(h) ; //鎖定指定內存對象,返回內存指向對象第一個字節的指針,增加內存對象的鎖定計數 strcpy(p,"this is a ClipBoard test") ; //將字符串拷貝到全局堆 SetClipboardData(CF_TEXT,h) ; //將指定內存對象的數據設置到剪切板 GlobalUnlock(h) ;//解鎖內存對象 并且減少鎖定計數 CloseClipboard() ; //關閉剪切板 在調用Open之后 必須有
2、清空剪切板
::EmptyClipboard() ; //清空剪切板
3、獲得剪切板的數據
::OpenClipboard(m_hWnd) ; //打開剪切板 if (IsClipboardFormatAvailab
le(CF_TEXT)) //如果剪切板中有文本類型的數據 { HANDLE h=GetClipboardData(CF_TEXT); // 獲得剪切板數據 所在的內存對象 char * p=(char*)GlobalLock(h) ; //通過鎖定內存對象 獲得剪切板緩沖區的指針 GlobalUnlock(h) ; //解鎖內存對象 減少 內存對象的鎖定技術 MessageBox(p) ; } Windows 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。