1. 程式人生 > >剪貼板

剪貼板

render 初始化 數據格式 回車 open 窗口 維護 查看 all

剪貼板實際上是系統維護管理的一塊內存區域,當在一個進程中復制數據時,是將這個數據放到該塊內存區域中,當在另一個進程中粘貼數據時,是從該塊內存區域中取出數據,然後顯示在窗口上;因為剪貼板是所有進程都可以訪問的,如果某程序已經打開了剪貼板,則其他程序將不能修改剪貼板,直到前者調用了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;

剪貼板