开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 22803|回复: 287
打印 上一主题 下一主题
收起左侧

[易语言纯源码] 后台截图图片黑色的解决方法

    [复制链接]
结帖率:0% (0/2)
跳转到指定楼层
楼主
发表于 2023-9-11 18:09:07 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   江西省宜春市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
本帖最后由 lyfm 于 2023-9-11 18:26 编辑

原本想用大漠写一个小程序游戏脚本,没想到在截图这里就卡主了,用大漠前台模式截图没有问题,后台绑定模式试了N多模式依然不行,没办法只好在网上去找,发现不止是我一个人这样,但是都没给出有效的解决办法,试过关掉硬件加速、修改注册表、还有乐玩截图模块、精易模块、网上下载的后台截图例子都不行,然后开始试python的截图代码终于找到了可用代码
[Python] 纯文本查看 复制代码
import cv2
import numpy as np
from ctypes import windll
import win32gui
import win32ui


def capture_win_alt(hwnd=None, bmpFileName='hwnd.bmp', jpgFileName='hwnd.png', delete=False,
                    program_windowTitle='塔防精灵', program_className='Chrome_WidgetWin_1'):
    # Adapted from https://stackoverflow.com/questions/19695214/screenshot-of-inactive-window-printwindow-win32gui
    windll.user32.SetProcessDPIAware()
    if not hwnd:
        hwnd = win32gui.FindWindow(None, program_windowTitle)
        # hwnd = win32gui.FindWindowEx(0, 0, program_className, program_windowTitle)
    #logger.info(f'hwnd: {hwnd}')
    if not hwnd:
        return None
    left, top, right, bottom = win32gui.GetClientRect(hwnd)
    w = right - left
    h = bottom - top
    hwnd_dc = win32gui.GetWindowDC(hwnd)
    mfc_dc = win32ui.CreateDCFromHandle(hwnd_dc)
    save_dc = mfc_dc.CreateCompatibleDC()
    bitmap = win32ui.CreateBitmap()
    bitmap.CreateCompatibleBitmap(mfc_dc, w, h)
    save_dc.SelectObject(bitmap)
    # If Special K is running, this number is 3. If not, 1
    result = windll.user32.PrintWindow(hwnd, save_dc.GetSafeHdc(), 3)
    bmpinfo = bitmap.GetInfo()
    bmpstr = bitmap.GetBitmapBits(True)
    img = np.frombuffer(bmpstr, dtype=np.uint8).reshape((bmpinfo["bmHeight"], bmpinfo["bmWidth"], 4))
    img = np.ascontiguousarray(img)[..., :-1]  # make image C_CONTIGUOUS and drop alpha channel
    if not result:  # result should be 1
        win32gui.DeleteObject(bitmap.GetHandle())
        save_dc.DeleteDC()
        mfc_dc.DeleteDC()
        win32gui.ReleaseDC(hwnd, hwnd_dc)
        raise RuntimeError(f"Unable to acquire screenshot! Result: {result}")
    cv2.imwrite(bmpFileName, img)
    return img


def main():
    WINDOW_NAME = "塔防精灵"
    while cv2.waitKey(1) != ord('q'):
        screenshot = capture_win_alt(program_windowTitle=WINDOW_NAME)
        cv2.imshow("TFJL",screenshot)
        if screenshot is not None:
            print(screenshot.shape)


if __name__ == '__main__':
    main()


然后又想到了超级模块去试试,结果也不行
打开超级模块 识图类1.窗口截图源码看了一下发现与python基本一致,
  
子程序名返回值类型公开备 注
窗口截图字节集 截取指定窗口的24位图,可截取窗口中指定区域,最小化窗口或不可见窗口无法截取位图
参数名类 型参考可空数组备 注
窗口句柄整数型欲截取窗口图片的窗口句柄
左边整数型默认为0 在窗口中截取图片的左边(相对于窗口的左边偏移坐标)
顶边整数型默认为0 在窗口中截取图片的顶边(相对于窗口的顶边偏移坐标)
宽度整数型在窗口中截取图片的宽度(若为空,则为窗口宽度或客户区宽度)
高度整数型在窗口中截取图片的高度(若为空,则为窗口高度或客户区高度)
非客户区逻辑型默认为假:仅截取客户区内范围图片,不含标题边框  真:截取窗口范围图片
变量名类 型静态数组备 注
矩形区域矩形坐标 
窗口大小矩形范围 
窗口位置坐标型 
新左边  
新顶边  
新宽度  
新高度  
屏幕设备上下文句柄整数型 
内存设备上下文句柄整数型 
位图句柄整数型 
旧位图句柄整数型 
位图BITMAP 
位图像素点阵字节集 
位图文件头BITMAPFILEHEADER 
位图文件头字节集字节集 
位图信息BITMAPINFO 
位图信息字节集字节集 
hmemdc整数型 
hbitmap整数型 
holdbitmap整数型 
hwnd_dc整数型 
如果真 (_句柄是否有效 (窗口句柄))
输出调试文本 (“指定窗口不存在,截图失败”)
返回 ({  })
如果真 (取反 (_窗口是否可见 (窗口句柄)))
输出调试文本 (“指定窗口不可见,无法截图”)
返回 ({  })
如果真 (取色深 () < 24)
输出调试文本 (“色深低于24位,无法截图”)
返回 ({  })
_窗口取外边框 (窗口句柄, 矩形区域)
' hwnd_dc = GetWindowDC (窗口句柄)
' 调试输出 (“hwnd_dc:” + 到文本 (hwnd_dc))
屏幕设备上下文句柄 = 取设备场景_ (0)
调试输出 (“屏幕设备上下文句柄:”到文本 (屏幕设备上下文句柄))
内存设备上下文句柄 = 创建内存场景_ (屏幕设备上下文句柄)
位图句柄 = 创建设备场景位图_ (屏幕设备上下文句柄, 矩形区域.矩形右边 - 矩形区域.矩形左边, 矩形区域.矩形底边 - 矩形区域.矩形顶边)
旧位图句柄 = 选入设备场景_ (内存设备上下文句柄, 位图句柄)
如果真 (取反 (PrintWindow (窗口句柄, 内存设备上下文句柄, 3)))
选入设备场景_ (内存设备上下文句柄, 旧位图句柄)
删除对象_ (位图句柄)
删除设备场景_ (内存设备上下文句柄)
释放设备场景_ (窗口句柄, 屏幕设备上下文句柄)
输出调试文本 (“抓取窗口位图失败”)
返回 ({  })
如果 (非客户区)
新左边 = 左边
新顶边 = 顶边
新宽度 = 宽度
新高度 = 高度
连续赋值 (0, 窗口大小.矩形宽度, 窗口大小.矩形高度, 窗口位置.x, 窗口位置.y)
_取窗口大小 (窗口句柄, 窗口大小)
_取窗口区域位置 (窗口句柄, 窗口位置)
新左边 = 窗口位置.x - 矩形区域.矩形左边 + 左边
新顶边 = 窗口位置.y - 矩形区域.矩形顶边 + 顶边
新宽度 = 选择 (宽度 < 1, 窗口大小.矩形宽度, 宽度)
新高度 = 选择 (高度 < 1, 窗口大小.矩形高度, 高度)
hmemdc = 创建内存场景_ (屏幕设备上下文句柄)
hbitmap = 创建设备场景位图_ (屏幕设备上下文句柄, 新宽度, 新高度)
holdbitmap = 选入设备场景_ (hmemdc, hbitmap)
复制场景位图_ (hmemdc, 0, 0, 新宽度, 新高度, 内存设备上下文句柄, 新左边, 新顶边, 13369376)
选入设备场景_ (内存设备上下文句柄, 旧位图句柄)
删除对象_ (位图句柄)
删除设备场景_ (内存设备上下文句柄)
内存设备上下文句柄 = hmemdc
位图句柄 = hbitmap
旧位图句柄 = holdbitmap
GetObjectA (位图句柄, 5 × 4 + 2 + 2, 位图)
位图信息.BITMAPINFOHEADER.biSize = 4 × 11
GetDIBits_BimapInfo (内存设备上下文句柄, 位图句柄, 0, 0, 0, 位图信息, 0)
位图像素点阵 = 取空白字节集 (位图信息.BITMAPINFOHEADER.biSizeImage)
位图信息.BITMAPINFOHEADER.biCompression = 0
GetDIBits (内存设备上下文句柄, 位图句柄, 0, 位图.bmHeight, 位图像素点阵, 位图信息, 0)
' 构造位图信息
位图信息字节集 = 取空白字节集 (位图信息.BITMAPINFOHEADER.biSize)
CopyMemory_BITMAPINFO (位图信息字节集, 位图信息, 位图信息.BITMAPINFOHEADER.biSize)
' 构造位图文件头
位图文件头.bfType = 19778
位图文件头.bfOffBits = 2 × 4 + 3 × 2 + 位图信息.BITMAPINFOHEADER.biSize
位图文件头.bfSize = 位图文件头.bfOffBits + 位图信息.BITMAPINFOHEADER.biSizeImage
位图文件头.bfReserved1 = 0
位图文件头.bfReserved2 = 0
位图文件头字节集 = 取空白字节集 (14)
CopyMemory_BITMAPFILEHEADER (位图文件头字节集, 位图文件头, 14)
选入设备场景_ (内存设备上下文句柄, 旧位图句柄)
删除对象_ (位图句柄)
删除设备场景_ (内存设备上下文句柄)
释放设备场景_ (0, 屏幕设备上下文句柄)
返回 (位图文件头字节集 + 位图信息字节集 + 位图像素点阵)


i支持库列表   支持库注释   
spec特殊功能支持库


发现两个函数最后一个参数不一样
PrintWindow (窗口句柄, 内存设备上下文句柄, 0)  超级模块
windll.user32.PrintWindow(hwnd, save_dc.GetSafeHdc(), 3) python

修改过后
后台截图成功    注意:最小化,隐藏窗口无效
其他的电脑不知道可不可行,反正我得电脑可以的
源码已经从超级模块中剥离出来,给有需要的朋友

截图测试.zip (75.49 KB, 下载次数: 736)



评分

参与人数 24好评 +10 精币 +36 收起 理由
洋滨 + 1 + 2 支持开源~!感谢分享
坤哥123cd + 1 + 2 支持开源~!感谢分享
陽陽陽 + 1 + 3 感谢分享,很给力!~
704910100 + 1 抓取窗口位图失败
tszc50 + 1 高分屏下截图不完整,屏幕缩放为200%,截图只能截取窗口左上4/1.
godandwoman + 1 + 2 很赞同,谢谢!
ppppzj + 1 + 2 支持开源~!感谢分享
XXGL2005 + 1 感谢分享,很给力!~
pj小黑屋 + 1 感谢分享,很给力!~
booms + 1 感谢分享,很给力!~
※逍遥游※ + 1 感谢分享,很给力!~
keyi5566 + 1 感谢分享,很给力!~
易语言资源网 + 1 + 3 开源精神必须支持~
qiyuer + 1 感谢分享,很给力!~
ican8 + 1 感谢分享,很给力!~
mmssel + 1 + 2 开源精神必须支持~
mypursue + 1 感谢分享,很给力!~
1828902364 + 1 感谢分享,很给力!~
无尘666 + 1 感谢分享,很给力!~
379061296 + 1 + 2 支持开源~!感谢分享
kyo9766 + 1 感谢分享,很给力!~
回不到的过去 + 1 你没试快照吧 原汁原味的 快照(窗口句柄) 有时候也好使的.
sinewtec + 1 + 4 支持开源~!感谢分享
书写寂伤 + 1 大漠后台截图VX小程序的要VX设置兼容模式win7

查看全部评分


本帖被以下淘专辑推荐:

签到天数: 10 天

287
发表于 5 天前 | 只看该作者   山东省青岛市
截图测试
回复 支持 反对

使用道具 举报

签到天数: 2 天

286
发表于 2024-11-13 22:14:33 | 只看该作者   湖北省天门市
回复 支持 反对

使用道具 举报

285
发表于 2024-10-23 19:09:14 | 只看该作者   广东省梅州市
很感谢,一直在找解决方案,
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 6 天

284
发表于 2024-10-18 17:40:24 | 只看该作者   四川省成都市
感谢大佬的分享~  我这边用你的方法也截图成功了~ 但是不知如何应用呢~  如何用例如乐玩大漠这种插件的命令的图色功能呢~  之前都是绑定之后就直接使用了~ 现在通过你这个截图如何转换~

补充内容 (2024-10-18 20:18):
比如把这个增加或者修改到乐玩模块里面去~ 我看了乐玩模块的绑定源码 以及截图类的  一头雾水~
回复 支持 反对

使用道具 举报

283
发表于 2024-10-16 00:14:23 | 只看该作者   湖南省长沙市
感谢分享,很给力!
回复 支持 反对

使用道具 举报

282
发表于 2024-10-14 08:46:06 高大上手机用户 | 只看该作者   山东省潍坊市
看看
回复 支持 反对

使用道具 举报

281
发表于 2024-10-13 18:16:35 | 只看该作者   山东省青岛市
万达阿德啊我
回复 支持 反对

使用道具 举报

签到天数: 10 天

280
发表于 2024-10-12 14:59:35 | 只看该作者   黑龙江省佳木斯市
回复 支持 反对

使用道具 举报

签到天数: 10 天

279
发表于 2024-10-12 14:56:11 | 只看该作者   黑龙江省佳木斯市
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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