| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 215 人关注过本帖
标题:请问如何将已保存到粘贴板里的截图存为指定文件(如d:\1.jpg)
只看楼主 加入收藏
shschy
Rank: 2
等 级:论坛游民
帖 子:142
专家分:45
注 册:2022-3-13
结帖率:39.13%
收藏
已结贴  问题点数:10 回复次数:9 
请问如何将已保存到粘贴板里的截图存为指定文件(如d:\1.jpg)
请问如何将已保存到粘贴板里的截图存为指定文件(如d:\1.jpg)
已完成对屏幕指定位置指定区间进行截图,并保存到粘贴板里,但从粘贴板里保存到文件无法成功,各种报错。环境win10+vfp9

搜索更多相关主题的帖子: 保存 指定文件 jpg 指定 环境 
2025-12-07 07:35
DANSON
Rank: 1
等 级:新手上路
帖 子:17
专家分:2
注 册:2025-10-4
收藏
得分:2 
回复 楼主 shschy
借花献佛:

https://bbs.bc-cn.net/viewthread.php?tid=514445&highlight=%BD%D8%CD%BC

3楼 sych 的代码,直接复用,完全OK!
2025-12-07 10:51
shschy
Rank: 2
等 级:论坛游民
帖 子:142
专家分:45
注 册:2022-3-13
收藏
得分:0 
学习后可以保存当前活动窗口截图,但如何保存win10黏贴板里的截图?
如保存当前活动窗口截图:   =myjt(_screen.hwnd,"_screen.bmp")
如保存当前VFP_窗口截图:   =myjt(_vfp.hwnd,"_vfp.jpg")
如何保存操作系统黏贴板里的截图?尝试=myjt(_cliptext,"_vfp.jpg")无效

PROCEDURE myjt(hwnd,tcFile)
LOCAL cFileExtName, cEncoder, iInputBuf, iResult, hDesktopDc, hVDc, hBitmap, hToken, hGdipBitmap,encoderClsid,lprect,x4,y4,abc
m.cFileExtName =LOWER( JUSTEXT( m.tcFile ))
ERASE (tcfile)
DECLARE INTEGER GetDC IN user32 INTEGER hwnd
Declare SHORT GetWindowRect IN user32 INTEGER hwnd, STRING @ lpRect
DECLARE Long ReleaseDC IN WIN32API  Long hWnd, Long hDc
DECLARE Long CreateCompatibleDC IN WIN32API  Long hDc
DECLARE Long DeleteDC IN WIN32API  Long hDc
DECLARE Long CreateCompatibleBitmap IN WIN32API  Long hDc, Long nWidth, Long nHeight
DECLARE Long SelectObject IN WIN32API  Long hDc, Long hObject
DECLARE Long DeleteObject IN WIN32API  Long hObject
DECLARE Long GdiplusStartup IN gdiplus Long @ token, String @ inputbuf, Long @ outputbuf
DECLARE Long GdiplusShutdown IN gdiplus  Long token
DECLARE Long GdipCreateBitmapFromHBITMAP IN gdiplus  Long hbitmap, Long hpalette, Long @ hGpBitmap
DECLARE Long GdipDisposeImage IN gdiplus  Long image
DECLARE Long GdipSaveImageToFile IN gdiplus Long nImage, String FileName,String @ clsIdEncoder, Long encoderParams
DECLARE INTEGER CLSIDFromString IN ole32 STRING lpsz, STRING @pclsid
DECLARE INTEGER PrintWindow IN user32 INTEGER,INTEGER,INTEGER
Declare Long GdipCreateBitmapFromScan0 in GdiPlus.dll ;
    Integer width, Integer height, Integer stride, Long format, Long scan0, Long @ bitmap
Declare Long GdipGetImageGraphicsContext in GdiPlus.dll    Long image, Long @ graphics
DECLARE LONG GdipDeleteGraphics IN GDIPLUS LONG graphics
Declare Long GdipDrawImageRectI in GdiPlus.dll ;
    Long graphics, Long image, Integer x, Integer y, Integer width, Integer height
lpRect=REPLICATE(CHR(0),16)
= GetWindowRect(Hwnd,@lpRect)
x4=ctobin(SUBSTR(lpRect,9,4),'4rs')-ctobin(SUBSTR(lpRect,1,4),'4rs')
y4=ctobin(SUBSTR(lpRect,13,4),'4rs')-ctobin(SUBSTR(lpRect,5,4),'4rs')
m.hDesktopDc = GetDC( m.hWnd )
m.hVdc = CreateCompatibleDC( m.hDesktopDc )
m.hBitmap = CreateCompatibleBitmap( m.hDesktopDc,x4,y4 )
ABC=SelectObject( m.hVdc, m.hBitmap )
=PrintWindow(m.hWnd,m.hVdc,0)
m.hToken = 0
m.iInputBuf = PADR(CHR(1), 16, CHR(0))
m.iResult = -1
IF ( 0 == GdiplusStartup( @ m.hToken, @ m.iInputBuf, 0 ))
    m.hGdipBitmap = 0
    IF ( 0 == GdipCreateBitmapFromHBITMAP(m.hBitmap, 0, @ m.hGdipBitmap ))
        lnFormat=0x00021808  &&24
        graphics = 0
        resizedImage = 0
        =GdipCreateBitmapFromScan0(x4,y4, 0, m.lnFormat, 0, @resizedImage)
        =GdipGetImageGraphicsContext(m.resizedImage, @graphics)
        =GdipDrawImageRectI(m.graphics, m.hGdipBitmap,0,0,x4,y4)
        m.encoderClsid  = "{557CF40"+chr(47+(at(m.cFileExtName,"bmpjpggif      tifpng")+2)/3)+"-1A04-11D3-9A73-0000F81EF32E}"
        cEncoder= REPLICATE(CHR(0),16)
        CLSIDFromString(STRCONV(m.encoderClsid + CHR(0), 5), @cEncoder)
        m.iResult = GdipSaveImageToFile(m.resizedImage,STRCONV( m.tcFile+CHR(0), 5 ), @ m.cEncoder, 0 )
        GdipDeleteGraphics(graphics)
        GdipDisposeImage(m.resizedImage)
        GdipDisposeImage( m.hGdipBitmap )
    ENDIF
    GdiplusShutdown( m.hToken )
ENDIF
DeleteObject( m.abc)
DeleteObject( m.hBitmap )
DeleteDC( m.hVdc )
ReleaseDC( 0, m.hDesktopDc )
调用方法:=myjt(窗口句柄,欲保存的图像全称)
如:=myjt(_screen.hwnd,"_screen.bmp")
   =myjt(_vfp.hwnd,"_vfp.jpg")
以下是引用DANSON在2025-12-7 10:51:53的发言:

借花献佛:

https://bbs.bc-cn.net/viewthread.php?tid=514445&highlight=%BD%D8%CD%BC

3楼 sych 的代码,直接复用,完全OK!

7 天前 05:20
DANSON
Rank: 1
等 级:新手上路
帖 子:17
专家分:2
注 册:2025-10-4
收藏
得分:0 
回复 3楼 shschy
哈哈,我将我的代码 和  sych 的代码融合在一起,完美实现同时传递给剪贴板和保存文件,不过确实是费了不少时间,但证明了技术上的可行性。
图片附件: 游客没有浏览图片的权限,请 登录注册
7 天前 14:00
shschy
Rank: 2
等 级:论坛游民
帖 子:142
专家分:45
注 册:2022-3-13
收藏
得分:0 
直接截图到粘贴板可以实现,但如何实现win10系统剪贴板里的截图,另存为指定文件,如d:\1.jpg
直接截图到粘贴板可以实现,但如何实现win10系统剪贴板里的截图,另存为指定文件,如d:\1.jpg
以下是引用DANSON在2025-12-8 14:00:36的发言:

哈哈,我将我的代码 和  sych 的代码融合在一起,完美实现同时传递给剪贴板和保存文件,不过确实是费了不少时间,但证明了技术上的可行性。

7 天前 18:20
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:828
专家分:3268
注 册:2018-3-13
收藏
得分:0 
截图到文件搞这么复杂,难道不用瓜哥的 myfll 吗?

这家伙很懒,啥也没留下
7 天前 20:06
foxfans
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:129
专家分:375
注 册:2021-10-23
收藏
得分:8 
DECLARE INTEGER OpenClipboard IN user32 INTEGER hwnd
DECLARE INTEGER CloseClipboard IN user32
DECLARE INTEGER GetClipboardData IN user32 INTEGER uFormat
DECLARE INTEGER IsClipboardFormatAvailable IN user32 INTEGER uFormat
DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
DECLARE INTEGER GdiplusStartup IN GDIPLUS.DLL INTEGER @token, STRING @inputbuf, INTEGER outputbuf
DECLARE INTEGER GdiplusShutdown IN GDIPLUS.DLL INTEGER token
DECLARE INTEGER GdipCreateBitmapFromHBITMAP IN GDIPLUS.DLL INTEGER hbm, INTEGER hpal, INTEGER @bitmap
DECLARE INTEGER GdipDisposeImage IN GDIPLUS.DLL INTEGER image
DECLARE INTEGER GdipSaveImageToFile IN GDIPLUS.DLL INTEGER image, STRING filename, STRING @clsidEncoder, STRING @encoderParams
DECLARE INTEGER CLSIDFromString IN Ole32.dll STRING lpsz, STRING @pclsid
#DEFINE CF_BITMAP 2
#DEFINE CF_DIB 8
#DEFINE IMAGE_BITMAP 0
#DEFINE LR_LOADFROMFILE 16

LOCAL lnResult, lhBitmap, lhDib, lnGdipBitmap, lcOutputFile, lcOutputFileW, lcEncoderClsID, lcUnicodeGuid
LOCAL lcErrorMsg, lnToken, lhGdip
IF IsClipboardFormatAvailable(CF_BITMAP) = 0
    MESSAGEBOX("剪贴板中没有位图数据!", 48, "错误")
    RETURN .F.
ENDIF
LOCAL lcGdiplusStartupInput, lnGdiplusToken
lnGdiplusToken = 0
lcGdiplusStartupInput = BINTOC(1,"4rs")+REPLICATE(CHR(0),12)  &&如果是64位 CCB 64 +REPLICATE(CHR(0),20)
lnResult = GdiplusStartup(@lnGdiplusToken, @lcGdiplusStartupInput, 0)
IF lnResult <> 0
    MESSAGEBOX("GDI+ 初始化失败!", 48, "错误")
    RETURN .F.
ENDIF
IF OpenClipboard(0) = 0
    MESSAGEBOX("无法打开剪贴板!", 48, "错误")
    GdiplusShutdown(lnGdiplusToken)
    RETURN .F.
ENDIF
lhBitmap = GetClipboardData(CF_BITMAP)
IF lhBitmap = 0
    CloseClipboard()
    GdiplusShutdown(lnGdiplusToken)
    MESSAGEBOX("无法从剪贴板获取位图!", 48, "错误")
    RETURN .F.
ENDIF
LOCAL lnGdipBitmap
lnGdipBitmap = 0
lnResult = GdipCreateBitmapFromHBITMAP(lhBitmap, 0, @lnGdipBitmap)
CloseClipboard()
IF lnResult <> 0 OR lnGdipBitmap = 0
    DeleteObject(lhBitmap)
    GdiplusShutdown(lnGdiplusToken)
    MESSAGEBOX("创建GDI+位图失败!", 48, "错误")
    RETURN .F.
ENDIF
*编码器的CLSID
*!*    #define CLSID_BMP     "{557CF400-1A04-11D3-9A73-0000F81EF32E}"
*!*    #define CLSID_JPEG     "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
*!*    #define CLSID_GIF     "{557CF402-1A04-11D3-9A73-0000F81EF32E}"
*!*    #define CLSID_TIFF     "{557CF405-1A04-11D3-9A73-0000F81EF32E}"
*!*    #define CLSID_PNG     "{557CF406-1A04-11D3-9A73-0000F81EF32E}"
lcUnicodeGuid = STRCONV("{557CF400-1A04-11D3-9A73-0000F81EF32E}" + CHR(0), 5)
lcEncoderClsID = REPLICATE(CHR(0), 16)
lnResult = CLSIDFromString(lcUnicodeGuid, @lcEncoderClsID)
lcOutputFile = "clipboard_" + TTOC(DATETIME(), 1) + ".bmp"
lcOutputFileW = STRCONV(lcOutputFile + CHR(0),5)
lnResult = GdipSaveImageToFile(lnGdipBitmap, @lcOutputFileW, @lcEncoderClsID, 0)
GdipDisposeImage(lnGdipBitmap)
DeleteObject(lhBitmap)
GdiplusShutdown(lnGdiplusToken)
IF lnResult = 0
    MESSAGEBOX("图片已保存到:" + CHR(13) + CHR(10) + lcOutputFile, 64, "成功")
    RETURN .T.
ELSE
    MESSAGEBOX("保存图片失败!", 48, "错误")
    RETURN .F.
ENDIF

[此贴子已经被作者于2025-12-8 21:40编辑过]

7 天前 20:59
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2362
专家分:4878
注 册:2012-2-29
收藏
得分:0 
谢谢!
6 天前 10:43
DANSON
Rank: 1
等 级:新手上路
帖 子:17
专家分:2
注 册:2025-10-4
收藏
得分:0 
回复 7楼 foxfans
牛,验证可用,谢谢分享!
6 天前 13:30
hsfisher
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:199
专家分:139
注 册:2009-4-26
收藏
得分:0 
谢谢分享!
6 天前 15:04
快速回复:请问如何将已保存到粘贴板里的截图存为指定文件(如d:\1.jpg)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020725 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved