| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 75 人关注过本帖, 1 人收藏
标题:分享:对屏幕进行截图,并将截图传递到剪贴板中
只看楼主 加入收藏
DANSON
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2025-10-4
收藏(1)
 问题点数:20 回复次数:4 
分享:对屏幕进行截图,并将截图传递到剪贴板中
************************************************
* 对屏幕进行截图,并将截图传递到剪贴板中
*=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
搜索更多相关主题的帖子: If 错误 传递 Integer 剪贴板 
昨天 12:21
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2356
专家分:4213
注 册:2007-4-27
收藏
得分:0 
谢谢楼主分离!请问如何使用?

只求每天有一丁点儿的进步就可以了
昨天 12:46
DANSON
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2025-10-4
收藏
得分:0 
回复 2楼 wengjl
全文复制粘贴到新建的.prg文件里,调用方法:
=CAPTURE_TO_CLIPBOARD() &&无任何提示,返回.t.,.f.
=CAPTURE_TO_CLIPBOARD(1) &&wait window 提示,返回.t.,.f.
=CAPTURE_TO_CLIPBOARD(2) &&messagebox 提示,返回.t.,.f.
昨天 14:12
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2343
专家分:4859
注 册:2012-2-29
收藏
得分:0 
谢谢分享!
昨晚 19:11
DANSON
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2025-10-4
收藏
得分:0 
如何将截图存为指定文件?

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

3楼 sych 的代码,直接复用,完全OK!
10 小时前
快速回复:分享:对屏幕进行截图,并将截图传递到剪贴板中
数据加载中...
 
   



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

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