剪貼板
剪貼板實際上是系統維護管理的一塊內存區域,當在一個進程中復制數據時,是將這個數據放到該塊內存區域中,當在另一個進程中粘貼數據時,是從該塊內存區域中取出數據,然後顯示在窗口上;因為剪貼板是所有進程都可以訪問的,如果某程序已經打開了剪貼板,則其他程序將不能修改剪貼板,直到前者調用了CloseClipboard函數,並且只有調用了EmptyClipboard函數清空剪貼板釋放剪貼板上數據的句柄,打開剪貼板的當前窗口才擁有剪貼板;
1、打開剪貼板
BOOL OpenClipboard();
返回值:打開剪貼板成功返回非0值,如果其他程序或當前窗口已打開了剪貼板則返回0;
2、關閉剪貼板
BOOL CloseClipboard();
返回值:關閉成功返回非0值,關閉失敗返回0;
3、清空剪貼板,釋放剪貼板中數據的句柄
BOOL EmptyClipboard();
返回值:函數操作成功返回非0值,失敗返回0;
4、以指定的剪貼板格式向剪貼板上放置數據
調用SetClipboardData函數的窗口必須是剪貼板的擁有者,在這之前,該程序必須已經調用了OpenClipboard函數打開了剪貼板;
HANDLE SetClipboardData(
UINT uFormat,
HANDLE hMem
);
uFormat:指定剪貼板格式,格式可以是已註冊的格式或任一種標準的剪貼板格式;CF_TEXT為標準的剪貼板文本格式,該格式下每行數據以回車換行符終止,並以空字符作為數據的結尾;
hMem:具有指定格式的數據的句柄;可以設為NULL采用延遲提交技術,在剪貼板上以指定的格式放置一個空剪貼板數據塊,直到有其他進程需要數據或者自身進程需要終止運行時,操作系統會向數據提供進程發送WM_RENDERFORMAT和WM_RENDERALLFORMAT消息,而數據提供進程在響應消息的函數中再次調用SetClipboardData函數,這時才真正提交數據到剪貼板上;再次調用SetClipboardData函數時,就不需要調用OpenClipboard函數和EmptyClipboard函數了;
5、調用GlobalAlloc函數從堆上分配指定數目的字節作為剪貼板數據的內存對象
HGLOBAL GlobalAlloc(
UINT uFlags,
DWORD dwBytes
);
uFlags:用來指定分配內存的方式,可取值如下;如果為0,對應為默認的GMEM_FIXED;
GHND --GMEM_MOVEABLE和GMEM_ZEROINIT的組合
GMEM_FIXED --分配一塊固定內存,返回值是一個指針,該內存對象其鎖計數總是0
GMEM_MOVEABLE --分配一塊可移動的內存,返回值是一塊內存對象句柄,可以用GlobalLock函數將這個句柄轉換為一個指針;創建一個進程時,系統為程序分配一塊默認堆,內存塊在物理內存中不能被移動,但可以在一個默認堆中被移動
GMEM_ZEROINIT --初始化內存的內容為0
GPTR --GMEM_FIXED和GMEM_ZEROINIT的組合
dwBytes:指定分配的字節數;
LPVOID GlobalLock( HGLOBAL hMem );
該函數將一個全局內存對象句柄轉換為一個指針;每個內存對象的內部數據結構中都包含了一個初始值為0的鎖計數,對於可移動的內存對象來說,GlobalLock函數將其鎖計數加1,而GlobalUnlock函數將該鎖計數減1;被鎖定的內存對象的內存塊將保持鎖定,不能被移動或被廢棄,直到它的鎖計數為0或調用GlobalRealloc函數重新分配該內存對象,該內存塊才能被移動或被廢棄;
BOOL GlobalUnlock( HGLOBAL hMem );
對於一個進程來說,每調用一次GlobalLock函數後,一定要調用對應次數的GlobalUnlock函數;
6、從剪貼板中獲得指定格式的數據
HANDLE GetClipboardData( UINT uFormat );
返回值:返回一個指定格式存在的剪貼板對象的句柄;
7、查看剪貼板中是否有所需的特定格式的數據
BOOL IsClipboardFormatAvailable( UINT format );
返回值:如果剪貼板上有所需的數據格式可用,則返回非0值,否則返回0;
剪貼板