Excel VBA及Access VBA自動(dòng)獲取剪切板圖片保存為文件

應(yīng)版主的邀請(qǐng),把早期2016年為一個(gè)客戶寫的一個(gè)VBA獲取剪貼板中的圖片,另存為文件或加載到圖片控件中的代碼分享一下

一、客戶的需求:一鍵把剪切板圖片加載到圖片控件

客戶的需求是把微信 QQ 中的復(fù)制的圖片粘貼在Access系統(tǒng)中,之前一直是先將微信中的圖片另存為一個(gè)文件,再在Access中選擇這個(gè)圖片,要多個(gè)步驟才能實(shí)現(xiàn),客戶提出能否直接復(fù)制粘貼就能實(shí)現(xiàn)。


二、實(shí)現(xiàn)的效果:按Ctr+V直接貼圖

用戶在圖片框按Ctr+V 即可直接將 剪切板中的圖片加載到圖片控件,一鍵實(shí)現(xiàn),非常高效


三、獲取剪切板的圖片并加載到圖片控件的思路

1、打開剪切板

2、判斷里面有否圖片

3、使用gdi 將圖片另存為文件

4、Access圖片控件加載圖片控件 (也可考慮直接從圖片流,不經(jīng)過(guò)文件的方法)


四、獲取剪切板的圖片轉(zhuǎn)為圖片文件的核心代碼

Option?Compare?DatabaseOption?Explicit
?Private?Declare?Function?OpenClipboard?Lib?"user32"?(ByVal?hwnd?As?Long)?As?LongPrivate?Declare?Function?CloseClipboard?Lib?"user32"?()?As?LongPrivate?Declare?Function?GetClipboardData?Lib?"user32"?(ByVal?wFormat?As?Long)?As?LongPrivate?Const?CF_BITMAP?=?2Private?Type?GUIDData1?As?LongData2?As?IntegerData3?As?IntegerData4(0?To?7)?As?ByteEnd?TypePrivate?Type?GDIPlusStartupInputGdiPlusVersion?As?LongDebugEventCallback?As?LongSuppressBackgroundThread?As?LongSuppressExternalCodecs?As?LongEnd?TypePrivate?Type?EncoderParameterGUID?As?GUIDNumberOfValues?As?LongType?As?LongValue?As?LongEnd?TypePrivate?Type?EncoderParametersCount?As?LongParameter?As?EncoderParameterEnd?TypePrivate?Declare?Function?GdiplusStartup?Lib?"gdiplus"?(token?As?Long,?inputbuf?As?GDIPlusStartupInput,?ByVal?outputbuf?As?Long)?As?LongPrivate?Declare?Function?GdiplusShutdown?Lib?"gdiplus"?(ByVal?token?As?Long)?As?LongPrivate?Declare?Function?GdipDisposeImage?Lib?"gdiplus"?(ByVal?image?As?Long)?As?LongPrivate?Declare?Function?GdipSaveImageToFile?Lib?"gdiplus"?(ByVal?image?As?Long,?ByVal?Filename?As?Long,?clsidEncoder?As?GUID,?encoderParams?As?Any)?As?LongPrivate?Declare?Function?CLSIDFromString?Lib?"ole32"?(ByVal?str?As?Long,?id?As?GUID)?As?LongPrivate?Declare?Function?GdipCreateBitmapFromHBITMAP?Lib?"gdiplus"?(ByVal?hbm?As?Long,?ByVal?hpal?As?Long,?bitmap?As?Long)?As?LongSub?TEST()
????Select?Case?CliptoJPG("c:\test.jpg")
????????Case?0:
????????????MsgBox?"剪貼板圖片已保存"
????????Case?1:
????????????MsgBox?"剪貼板圖片保存失敗"
????????Case?2:
????????????MsgBox?"剪貼板中無(wú)圖片"
????????Case?3:
????????????MsgBox?"剪貼板無(wú)法打開,可能被其他程序所占用"
????End?SelectEnd?SubPublic?Function?CliptoJPG(ByVal?destfilename?As?String,?Optional?ByVal?Quality?As?Byte?=?80,?Optional?blnJustCheck?As?Boolean?=?False)?As?Integer'*****該函數(shù)用于取出剪貼板中圖片轉(zhuǎn)換為jpg文件另存到指定路徑****??修改:2016/07/18'參數(shù)說(shuō)明:'?????destfilename:要保存的jpg文件的完整路徑,必要參數(shù);'?????quality:?jpg文件的質(zhì)量,0-100之間的數(shù)值,數(shù)值越大,圖片質(zhì)量越高'返回值:'?????0-保存成功;1-保存失??;2-剪貼板中無(wú)位圖數(shù)據(jù);3-無(wú)法打開剪貼板
????Dim?tSI?As?GDIPlusStartupInput
????Dim?lRes?As?Long
????Dim?lGDIP?As?Long
????Dim?lBitmap?As?Long
????Dim?hBmp?As?Long
???
????'嘗試打開剪貼板????If?OpenClipboard(0)?Then
????????'嘗試取出剪貼板中位圖的句柄????????hBmp?=?GetClipboardData(CF_BITMAP)
????????'如果hBmp為0,說(shuō)明剪貼板中沒(méi)有存放圖片????????If?hBmp?=?0?Then
????????????CliptoJPG?=?2
????????????CloseClipboard
????????????Exit?Function
????????End?If
????????CloseClipboard
????Else???'如果openclipboard返回0(False),說(shuō)明剪貼板被其他程序所占用????????CliptoJPG?=?3
????????Exit?Function
????End?If
????
????If?blnJustCheck?Then?Exit?Function
???
????'初始化?GDI+
????tSI.GdiPlusVersion?=?1
????lRes?=?GdiplusStartup(lGDIP,?tSI,?0)
?????
????If?lRes?=?0?Then
????????'從句柄創(chuàng)建?GDI+?圖像????????lRes?=?GdipCreateBitmapFromHBITMAP(hBmp,?0,?lBitmap)
?????????
????????If?lRes?=?0?Then
????????????Dim?tJpgEncoder?As?GUID
????????????Dim?tParams?As?EncoderParameters
????????????
????????????'初始化解碼器的GUID標(biāo)識(shí)????????????CLSIDFromString?StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"),?tJpgEncoder
????????????
????????????'設(shè)置解碼器參數(shù)????????????tParams.Count?=?1
????????????With?tParams.Parameter?'?Quality????????????????'得到Quality參數(shù)的GUID標(biāo)識(shí)????????????????CLSIDFromString?StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"),?.GUID
????????????????.NumberOfValues?=?1
????????????????.Type?=?4
????????????????.Value?=?VarPtr(Quality)
????????????End?With
????????????
????????????'保存圖像????????????lRes?=?GdipSaveImageToFile(lBitmap,?StrPtr(destfilename),?tJpgEncoder,?tParams)
????????????If?lRes?=?0?Then
????????????????CliptoJPG?=?0??'轉(zhuǎn)換成功????????????Else
????????????????CliptoJPG?=?1??'轉(zhuǎn)換失敗????????????End?If
????????????
????????????'銷毀GDI+圖像????????????GdipDisposeImage?lBitmap
????????End?If
?????????
????????'銷毀?GDI+????????GdiplusShutdown?lGDIP
????End?IfEnd?Function

五、監(jiān)控按鍵的事件

至于按鈕的處理就簡(jiǎn)單了,大致使用下面的方式實(shí)現(xiàn)的



大致就是這樣實(shí)現(xiàn)的.??


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容