腦袋里沒有點API的儲量,想寫什么東西還是很困難的。厚積薄發才是硬道理。所以先看看別人的代碼,偷學幾個API的用法。

SetClipData proc lpData:LPSTR,dwSize:dword
    LOCAL    hMem:HANDLE ;
==>內存塊句柄
    LOCAL    pMem:dword  ;
==>內存塊指針

    mov        eax,dwSize
    shr        eax,
3
    inc        eax
    shl        eax,
3 ;==>(dwSize/8 + 1)*8 不滿8的倍數則補全
    invoke xGlobalAlloc, GHND or GMEM_DDESHARE, eax
    test    eax,eax       ;
==>申請成功則繼續否則跳轉到@exit2
    je        @exit2
    mov        hMem,eax
    invoke GlobalLock,eax    ;hGlob ;
==>鎖定申請的內存塊返回內存塊指針
    test    eax,eax
    je        @exit1
    mov        pMem,eax
    invoke RtlMoveMemory,eax,lpData,dwSize  ;
==>復制lpData的內容到申請的內存塊中
    mov        eax,pMem
    add        eax,dwSize
    mov        
byte ptr [eax],0 ;==>在內存塊最后添0結束
    invoke GlobalUnlock,hMem ;
==>解鎖,使內存塊指針無效
    invoke OpenClipboard,NULL
    .
if eax
        invoke EmptyClipboard
        invoke SetClipboardData,CF_TEXT,hMem ;
==>將數據關聯到剪貼板
        invoke CloseClipboard
        xor        eax,eax        ;
0 - Ok
        jmp        @exit3
    .endif
  @exit1:
    invoke  GlobalFree, hMem ;
==>未鎖定成功則釋放該內存塊
    xor     eax, eax
  @exit2:
    dec     eax          ; 
-1 - error
  @exit3:
    ret

SetClipData endp

看完這段代碼我有一個疑問,這里是將lpData的數據拷貝到一個內存塊,然后與剪貼板關聯,我這里解釋為關聯,我就認為剪貼板不應該是一個內存區域,我猜測是一個鏈表之類的結構,然后鏈表每一個節點存儲一個內存區域的指針還有其他的信息,然后根據信息來管理。

否則應該可以直接將lpData來跟剪貼板關聯。另一個原因是lpData是局部的隨時會被釋放的。如有不正確還望指正。