我想从剪贴板中复制保存在剪贴板中的位图,即画图等。
到目前为止,我的代码如下:
ulong l_handle, l_datasize, l_lock
long l_file
uint i_format
blob lb_blob
n_bitmap ln_bit
l_handle = handle(parent)
OpenClipboard(l_handle)
//2 = Bitmap
//8 = Bitmapinfo
if not IsClipboardFormatAvailable(8) then
closeclipboard()
return
end if
l_handle = GetclipboardData( 8)
l_lock = GlobalLock(l_handle)
if not isnull(l_lock) then
l_datasize = GlobalSize(l_lock)
if l_datasize>0 then
lb_blob = blob(space(l_datasize), EncodingAnsi!)
ReadClipboardData(lb_blob, l_lock, l_datasize)
GlobalUnlock(l_handle)
closeClipboard()
if not isnull(lb_blob) then
//l_file = fileopen("c:temptest.dib", StreamMode!, Write!, LockReadWrite!, Replace!)
ln_bit.of_writeblob( "c:temptest.bmp", lb_blob)
ln_bit.of_writeblob( "c:temptest1.bmp", BlobMid(lb_blob, 15) )
ln_bit.of_writeblob( "c:temptest2.bmp", BlobMid(lb_blob, 169))
ln_bit.of_writeblob( "c:temptest3.bmp", BlobMid(lb_blob, 14))
ln_bit.of_writeblob( "c:temptest4.bmp", BlobMid(lb_blob, 168))
//FileWriteEx(l_file, lb_blob)
//fileclose(l_file)
//p_1.setpicture(lb_blob)
end if
end if
GlobalUnlock(l_handle)
end if
closeClipboard()
外部函数
Function Ulong GetClipboardData ( &
uint uFormat&
) Library "user32.dll"
Function boolean OpenClipboard ( &
long hWndNewOwner &
) Library "user32.dll"
Function boolean CloseClipboard ( &
) Library "user32.dll"
Function ulong GlobalLock(&
ulong hMem&
) Library "kernel32.dll"
Function boolean GlobalUnlock( ulong hMem) Library "kernel32.dll"
SUBROUTINE ReadClipboardData(ref blob Destination, ulong Source, ulong&
Length) Library "KERNEL32.DLL" Alias for "RtlMoveMemory"
FUNCTION ulong GlobalSize(ulong hMem) Library "kernel32.dll"
FUNCTION boolean IsClipboardFormatAvailable(ulong format) Library "user32.dll"
对于 GetclipboardData( ),我使用值 8(Bitmapinfo),因为 2(Bitmap) 在调用 GlobalLock 函数时总是返回零。
所以现在我正在 Blob 中获取位图信息,但无法保存它。它总是说图像已损坏。我在of_writeblob函数中尝试所有这些 BlobMid 东西的原因是我想从 bitmapinfo 中提取位图(如果可能的话)。
在这里"http://www.topwizprogramming.com/freecode_bitmap.html"他们正在创建一个位图信息,并且 blobheader 的长度为 14,所以我认为它可以以这种方式工作,但文件仍然损坏。我想信息只包含信息,而不是实际的位图。
有没有人解决这个问题,或者有没有我可以简单地使用的 dll?
编辑:在topwiz示例中,他们正在创建一个包含标题,信息和实际位图的完整位图,因此我猜我的尝试只能失败。所以主要问题是,为什么 Globallock 函数在使用参数 2 调用 getclipboarddata 时返回零
所以如果有人感兴趣,我想出了更多的东西。首先,您不必使用位图调用 GlobalLock,因为它已经为您提供了 HBitmap 的句柄。尽管使用该句柄也会在损坏的文件中解析(并且在调用 globalsize 时崩溃)。我还尝试将标头和位图信息与 hbitmap 中的 blob 一起添加,但也导致了文件损坏。
我现在所做的是用c ++(visual studio)创建了一个.dll,并在pfc_messagerouter中调用该函数。在这里你可以下载一个小样本:下载
(位图文件保存在 c:\temp\test.bmp 下,您可以在按钮的点击事件中更改它)