ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 107|回复: 2

[VBA程序开发] 求VBA截取屏幕区域代码修改

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-12-26 14:09 | 显示全部楼层 |阅读模式
本帖最后由 lsggjie 于 2024-12-26 14:24 编辑

在豆包上提问回复了vba截取屏幕的代码,但是运行时提示“子过程或函数未定义”,怎么回事,请大佬们看看,给修改一下,谢谢!


Option Explicit


Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SaveBitmapToFile Lib "gdi32" (ByVal hBitmap As Long, ByVal lpFileName As String) As Long


'定义vbSrcCopy常量
Private Const vbSrcCopy As Long = &HCC0020
Sub CaptureScreenArea()
'    On Error Resume Next
    Dim leftPos As Long, topPos As Long, width As Long, height As Long
    leftPos = 100 ' 截取区域的左边界
    topPos = 100 ' 截取区域的上边界
    width = 400  ' 截取区域的宽度
    height = 300 ' 截取区域的高度


    Dim hWnd As Long
    hWnd = GetDesktopWindow()
    Dim hDC As Long
    hDC = GetDC(hWnd)


    Dim memDC As Long
    memDC = CreateCompatibleDC(hDC)


    Dim hBitmap As Long
    hBitmap = CreateCompatibleBitmap(hDC, width, height)


    Dim oldBitmap As Long
    oldBitmap = SelectObject(memDC, hBitmap)


    BitBlt memDC, 0, 0, width, height, hDC, leftPos, topPos, vbSrcCopy


    SelectObject(memDC, oldBitmap)


    SaveBitmapToFile hBitmap, ThisWorkbook.Path & "\screenshot.bmp"


    DeleteObject hBitmap
    DeleteDC memDC
    ReleaseDC hWnd, hDC
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-12-27 08:46 | 显示全部楼层
有哪位大佬高手给解决一下吗?

TA的精华主题

TA的得分主题

发表于 2024-12-27 13:24 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lsggjie 发表于 2024-12-27 08:46
有哪位大佬高手给解决一下吗?

Private Type PicBmp
    Size As Long
    type As Long
    hbmp As LongPtr
    hPal As Long
    Reserved As Long
End Type
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Declare PtrSafe Function GetDesktopWindow _
    Lib "user32" () As LongPtr
Private Declare PtrSafe Function GetDC Lib "user32" ( _
    ByVal hWnd As LongPtr) As LongPtr
Private Declare PtrSafe Function ReleaseDC Lib "user32" ( _
    ByVal hWnd As LongPtr, ByVal hDC As LongPtr) As LongPtr
Private Declare PtrSafe Function BitBlt Lib "gdi32" ( _
    ByVal hDestDC As LongPtr, ByVal x As Long, ByVal y As Long, _
    ByVal nWidth As Long, ByVal nHeight As Long, _
    ByVal hSrcDC As LongPtr, ByVal xSrc As Long, ByVal ySrc As Long, _
    ByVal dwRop As Long) As Long
Private Declare PtrSafe Function CreateCompatibleDC Lib "gdi32" ( _
    ByVal hDC As LongPtr) As LongPtr
Private Declare PtrSafe Function CreateCompatibleBitmap _
    Lib "gdi32" (ByVal hDC As LongPtr, ByVal nWidth As Long, _
    ByVal nHeight As Long) As Long
Private Declare PtrSafe Function SelectObject Lib "gdi32" ( _
    ByVal hDC As LongPtr, ByVal hObject As LongPtr) As LongPtr
Private Declare PtrSafe Function DeleteDC Lib "gdi32" ( _
    ByVal hDC As LongPtr) As LongPtr
Private Declare PtrSafe Function DeleteObject Lib "gdi32" ( _
    ByVal hObject As LongPtr) As LongPtr
'office32位:"olepro32.dll"
Private Declare PtrSafe Function OleCreatePictureIndirect _
    Lib "oleaut32.dll" (PicDesc As PicBmp, RefIID As GUID, _
    ByVal fPictureOwnsHandle As Long, Ipic As IPicture) As Long
   
'定义vbSrcCopy常量
Private Const vbSrcCopy As Long = &HCC0020

Sub CaptureScreenArea()
'    On Error Resume Next
    Dim leftPos As Long, topPos As Long
    Dim width As Long, height As Long
    leftPos = 100 ' 截取区域的左边界
    topPos = 100 ' 截取区域的上边界
    width = 400  ' 截取区域的宽度
    height = 300 ' 截取区域的高度

    Dim hWnd As LongPtr
    hWnd = GetDesktopWindow()
    Dim hDC As LongPtr
    hDC = GetDC(hWnd)

    Dim memDC As LongPtr
    memDC = CreateCompatibleDC(hDC)
    Dim hBitmap As LongPtr
    hBitmap = CreateCompatibleBitmap(hDC, width, height)

    Dim oldBitmap As LongPtr
    oldBitmap = SelectObject(memDC, hBitmap)
    BitBlt memDC, 0, 0, width, height, hDC, leftPos, topPos, vbSrcCopy
      
    Dim Sliid As GUID, hpic As PicBmp
    With Sliid
        .Data1 = &H20400
        .Data4(0) = &HC0
        .Data4(7) = &H46
    End With
    With hpic
        .Size = Len(hpic)
        .type = 1
        .hbmp = hBitmap
        .hPal = 0
    End With
   
    Dim Ipic As IPictureDisp, pfile As String
    OleCreatePictureIndirect hpic, Sliid, 1, Ipic
    pfile = ThisWorkbook.Path & "\screenshot.bmp"
    SavePicture Ipic, pfile

    DeleteObject hBitmap
    DeleteDC memDC
    ReleaseDC hWnd, hDC
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-5 09:02 , Processed in 0.018915 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表