腦袋里沒有點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是局部的隨時會被釋放的。如有不正確還望指正。