如保存当前活动窗口截图: =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.
3楼 sych 的代码,直接复用,完全OK!