分享:对屏幕进行截图,并将截图传递到剪贴板中
************************************************* 对屏幕进行截图,并将截图传递到剪贴板中
*=CAPTURE_TO_CLIPBOARD()
Function CAPTURE_TO_CLIPBOARD()
Lparameters CAP_SCREEN_MESS
CAP_SCREEN_MESS = Iif(Parameters() = 0, 0, CAP_SCREEN_MESS) && 0:不提示;1:WAIT WIND 提示;2:messagebox 提示
Local CAP_SCREEN_DC, CAP_MEMORY_DC, CAP_BITMAP_BMP, LNOLDOBJ, CAP_WIDTHN_SCR, CAP_HEIGHT_SCR, CAP_SCREEN_HDL, CAP_SCREEN_MS, CAP_SCREEN_RT
* 声明必要的 API 函数
Declare Integer GetDC In user32 Integer HWnd
Declare Integer ReleaseDC In user32 Integer HWnd, Integer hDC
Declare Integer CreateCompatibleDC In gdi32 Integer hdc
Declare Integer CreateCompatibleBitmap In gdi32 Integer hdc, Integer Width, Integer Height
Declare Integer SelectObject In gdi32 Integer hdc, Integer hgdiobj
Declare Integer DeleteObject In gdi32 Integer hObject
Declare Integer BitBlt In gdi32 Integer hDestDC, Integer x, Integer Y, Integer Width, Integer Height, Integer hSrcDC, Integer xSrc, Integer ySrc, Integer rop
Declare Integer DeleteDC In gdi32 Integer hdc
Declare Integer GetSystemMetrics In user32 Integer nIndex
Declare Integer OpenClipboard In user32 Integer hWndNewOwner
Declare Integer EmptyClipboard In user32
Declare Integer CloseClipboard In user32
Declare Integer SetClipboardData In user32 Integer wFormat, Integer Hmem
Declare Integer GetLastError In WIN32API
#Define SM_CXSCREEN 0
#Define SM_CYSCREEN 1
#Define CF_BITMAP 2
CAP_SCREEN_MS = "" && 提示信息
CAP_SCREEN_RT = .T. && 返回值,预设截图并传递给剪贴板成功
* 1. 获取屏幕尺寸
CAP_WIDTHN_SCR = GETSYSTEMMETRICS(SM_CXSCREEN)
CAP_HEIGHT_SCR = GETSYSTEMMETRICS(SM_CYSCREEN)
* 2. 获取屏幕DC和内存DC
CAP_SCREEN_DC = GETDC(0)
CAP_MEMORY_DC = CREATECOMPATIBLEDC(CAP_SCREEN_DC)
* 3. 创建兼容位图
CAP_BITMAP_BMP = CREATECOMPATIBLEBITMAP(CAP_SCREEN_DC, CAP_WIDTHN_SCR, CAP_HEIGHT_SCR)
CAP_OLDOBJ_BMP = SELECTOBJECT(CAP_MEMORY_DC, CAP_BITMAP_BMP)
* 4. 截图(BitBlt)
CAP_SCREEN_HDL = BITBLT(CAP_MEMORY_DC, 0, 0, CAP_WIDTHN_SCR, CAP_HEIGHT_SCR, CAP_SCREEN_DC, 0, 0, 0XCC0020)
If CAP_SCREEN_HDL = 1
* 5. 打开剪贴板
If OPENCLIPBOARD(0) = 0 && 正确检查返回值(0表示失败)
CAP_SCREEN_MS = "无法打开剪贴板(错误代码:" + Transform(GETLASTERROR())+" )!"
CAP_SCREEN_RT = .F.
Else
* 6. 清空剪贴板
CAP_SCREEN_HDL = EMPTYCLIPBOARD()
If CAP_SCREEN_HDL = 1
* 7. 设置剪贴板数据(CF_BITMAP 格式)
If SETCLIPBOARDDATA(CF_BITMAP, CAP_BITMAP_BMP) = 0
CAP_SCREEN_MS = "无法设置剪贴板数据,位图数据传递到剪贴板失败(" +Transform(CAP_SCREEN_HDL)+ "错误代码:" + Transform(GETLASTERROR())+" )!"
CAP_SCREEN_RT = .F.
Endif
* 8. 关闭剪贴板
= CLOSECLIPBOARD()
Else
CAP_SCREEN_MS = "无法清空剪贴板数据,为位图数据传递腾挪空间(操作返回码: " +Transform(CAP_SCREEN_HDL)+ ",错误代码:" + Transform(GETLASTERROR())+" )!"
CAP_SCREEN_RT = .F.
Endif
Endif
Else
CAP_SCREEN_MS = "截图未成功(操作返回码: " +Transform(CAP_SCREEN_HDL)+ ",错误代码:" + Transform(GETLASTERROR())+" )!"
CAP_SCREEN_RT = .F.
Endif
CAP_SCREEN_MS = Iif(CAP_SCREEN_RT, "成功截图,并已传递到剪贴板,请打开“画图”等应用程序, Ctrl+V 粘贴验证。", CAP_SCREEN_MS)
If CAP_SCREEN_MESS > 0 And !Empty(CAP_SCREEN_MS)
If CAP_SCREEN_MESS = 1
Wait Window Iif("!"$CAP_SCREEN_MS, "错误", "恭喜") +":"+ CAP_SCREEN_MS Nowait
Else
=Messagebox(CAP_SCREEN_MS, Iif("!"$CAP_SCREEN_MS, 48, 64), Iif("!"$CAP_SCREEN_MS, "错误!", "恭喜"))
Endif
Endif
* 9. 清理资源
= SELECTOBJECT(CAP_MEMORY_DC, CAP_OLDOBJ_BMP)
= DELETEDC(CAP_MEMORY_DC)
= RELEASEDC(0, CAP_SCREEN_DC)
* 注意:不删除 CAP_BITMAP_BMP,因为剪贴板已接管该资源
Return CAP_SCREEN_RT
Endfunc









