精易论坛

标题: 后台截图图片黑色的解决方法 [打印本页]

作者: lyfm    时间: 2023-9-11 18:09
标题: 后台截图图片黑色的解决方法
本帖最后由 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

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






作者: lrbf810    时间: 2023-9-11 22:08
谢谢分享~!
作者: menghan    时间: 2023-9-11 22:15
感谢楼主分享,支持一下~~
作者: bianyuan456    时间: 2023-9-11 22:17
已经顶贴,感谢您对论坛的支持!
作者: lrbf810    时间: 2023-9-11 22:20
PrintWindow函数是Windows API中的一个函数,用于将指定窗口及其所有子窗口的可见部分或整个内容输出到设备上(如打印机或图像文件)。

第三个参数是位掩码(bitmask),用于标识要打印的窗口的内容。下面是第三个参数为0、1、2、3时的意义:

当第三个参数为0时,函数将只打印窗口的客户区域(不包括边框和标题栏等非客户区域),即只输出窗口内部的内容。

当第三个参数为1时,函数将打印整个窗口(包括客户区域和非客户区域),即输出包括边框、标题栏等在内的整个窗口。

当第三个参数为2时,函数将只打印窗口的非客户区域,即只输出边框、标题栏等窗口外观部分。

当第三个参数为3时,函数将打印整个窗口及其子窗口(包括客户区域和非客户区域),即输出整个窗口及其所有子窗口的内容。

----------------------------------
为啥这个参数跟后台有关呢?没搞明白
作者: ゞωǒ天堂牧心    时间: 2023-9-11 22:27
隐藏窗口无效
作者: 风崔宇打    时间: 2023-9-11 22:29
谢谢分享~!
作者: Healer丶    时间: 2023-9-11 22:47
谢谢分享~!
作者: 一C    时间: 2023-9-11 23:16
支持大佬
作者: sub    时间: 2023-9-11 23:28
顶顶顶顶顶顶顶顶顶顶顶
作者: 天雨时晴    时间: 2023-9-11 23:31
谢谢分享
作者: Kyu    时间: 2023-9-11 23:32

作者: ouding    时间: 2023-9-11 23:38
其实降级VX就行了
作者: 临安    时间: 2023-9-11 23:40
看下隐藏内容~~
作者: kimeti    时间: 2023-9-11 23:45
之前经历过,win11截不到,win10没问题。
作者: lyfm    时间: 2023-9-11 23:54
kimeti 发表于 2023-9-11 23:45
之前经历过,win11截不到,win10没问题。

我系统就是win11的  现在可以了
作者: lyfm    时间: 2023-9-11 23:57
lrbf810 发表于 2023-9-11 22:20
PrintWindow函数是Windows API中的一个函数,用于将指定窗口及其所有子窗口的可见部分或整个内容输出到设备 ...

这是半后台 最小化 隐藏窗口无效  找了好多天代码才搞定
作者: 安陆华硕专卖    时间: 2023-9-12 00:00

谢谢分享
作者: 空心los    时间: 2023-9-12 00:03

作者: CanK    时间: 2023-9-12 00:10
感谢分享
作者: lyfm    时间: 2023-9-12 00:12
ouding 发表于 2023-9-11 23:38
其实降级VX就行了

怎么操作,教教
作者: JYYeah    时间: 2023-9-12 00:26
感谢分享!!!
作者: qingqingqp    时间: 2023-9-12 00:42
666666666666666666666666
作者: 技术    时间: 2023-9-12 00:51
学习学习感谢分享
作者: 风行无忌    时间: 2023-9-12 00:57
支持一个!
作者: zzh233    时间: 2023-9-12 01:36
就是说必须前台窗口 可遮挡
作者: lyfm    时间: 2023-9-12 02:33
zzh233 发表于 2023-9-12 01:36
就是说必须前台窗口 可遮挡

对  随便到哪里都可以 ,不最小化都可以
作者: sunhechao    时间: 2023-9-12 03:15
大佬牛啊
作者: muye84    时间: 2023-9-12 04:09
大佬牛啊
作者: 缺1份矜持ゝ    时间: 2023-9-12 06:45
感谢.这个可以有.
作者: 萧然    时间: 2023-9-12 07:15
必须支持!!感谢!!
作者: zzh233    时间: 2023-9-12 07:52
lyfm 发表于 2023-9-12 02:33
对  随便到哪里都可以 ,不最小化都可以

这么强大建议收录到精易模块
作者: 332833316    时间: 2023-9-12 07:55

作者: Toomy    时间: 2023-9-12 08:18
试试了 谢谢
作者: alfjal    时间: 2023-9-12 08:19
6666666666666666666666666
作者: 像神一样飘渺    时间: 2023-9-12 08:46
这不就是大漠的截图吗
作者: huaidan2015    时间: 2023-9-12 09:05

大佬牛啊
作者: 一指温柔    时间: 2023-9-12 09:11
感谢分享~
作者: 君九    时间: 2023-9-12 09:23
是辅助吗
作者: sinewtec    时间: 2023-9-12 09:24
支持开源~!感谢分享
作者: jia201314973    时间: 2023-9-12 09:28
支持开源~!感谢分享
作者: 铅笔刀    时间: 2023-9-12 09:45
测试一下先
作者: 天地予    时间: 2023-9-12 09:45
看看学习一下
作者: sostemp    时间: 2023-9-12 10:11
支持开源~!感谢分享
作者: kantal    时间: 2023-9-12 10:31
支持开源~!感谢分享
作者: 哑巴ii    时间: 2023-9-12 10:45
6666666666666
作者: kyo9766    时间: 2023-9-12 11:02
学习一下怎么后台截图,感谢分享
作者: Elite    时间: 2023-9-12 11:10
看看学习一下
作者: jingyi120    时间: 2023-9-12 11:23
学习下,如果有支持反反截屏的最好不过了
作者: shituo    时间: 2023-9-12 11:45
注意:最小化,隐藏窗口无效
作者: 网络注册会员    时间: 2023-9-12 11:56
        支持开源
作者: 泭流    时间: 2023-9-12 11:57
支持开源~!感谢分享
作者: 裤子兄    时间: 2023-9-12 12:00
谢谢分享,看一下。
作者: wjswzj0    时间: 2023-9-12 12:08
感谢大佬
作者: caskywz    时间: 2023-9-12 12:09
典型的DC截图
作者: futiem    时间: 2023-9-12 12:17
后台截图成功
作者: gdhong    时间: 2023-9-12 12:27
感谢分享
作者: lyfm    时间: 2023-9-12 14:08
像神一样飘渺 发表于 2023-9-12 08:46
这不就是大漠的截图吗

大漠绑定后台模式截到的图是黑色的,试过N种绑定模式
作者: ljx111    时间: 2023-9-12 14:21
感谢分享~~~~~~~~~~~
作者: ensurf    时间: 2023-9-12 14:30
学习一下
作者: a897887419    时间: 2023-9-12 14:35
最小化,隐藏窗口无效
作者: 小虎来了    时间: 2023-9-12 15:01
必须要看看是什么好动下啊
作者: zjmowu    时间: 2023-9-12 16:34
学习一下

作者: sd2241116    时间: 2023-9-12 16:50
看看怎么样
作者: 查过    时间: 2023-9-12 17:28
下个学习一下
作者: 豆豆灰常开心    时间: 2023-9-12 17:32
全都是大佬~
作者: chenxiaoman1    时间: 2023-9-12 17:41
支持开源~!感谢分享
作者: tiancai88888888    时间: 2023-9-12 18:01
66666666666666666666
作者: chenxiang    时间: 2023-9-12 18:29
感谢分享~~~~~~~~~~~

作者: po1718    时间: 2023-9-12 19:47
支持开源~!感谢分享
作者: luonia    时间: 2023-9-12 21:30
        感谢分享,很给力!~
作者: hegh    时间: 2023-9-12 22:23
感谢分享,很给力!~
作者: 379061296    时间: 2023-9-12 22:43
感谢分享
作者: 379061296    时间: 2023-9-12 22:59
本帖最后由 379061296 于 2023-9-12 23:00 编辑

你试试可以这个不

不知道什么鬼,上传不了附件
作者: 南方填表    时间: 2023-9-13 00:22
看看整合需要得
作者: 大金刚弟弟    时间: 2023-9-13 01:09
支持一下大佬,!!
作者: 查过    时间: 2023-9-13 07:29
已经顶贴,感谢您对论坛的支持!
作者: 豆豆灰常开心    时间: 2023-9-13 07:33
已经顶贴,感谢您对论坛的支持!
作者: 齐恩    时间: 2023-9-13 09:11
有意思 感谢分享!
作者: oycs429    时间: 2023-9-13 09:52
楼主辛苦了,谢谢楼主发的好帖子~
作者: 肥蛋仔    时间: 2023-9-13 10:07
感谢分享,很给力!~
作者: yizf7n    时间: 2023-9-13 10:32

作者: Antony    时间: 2023-9-13 10:39
支持开源~!感谢分享很给力!~
作者: wacy1024    时间: 2023-9-13 10:56
666666666666666666
作者: feng5555    时间: 2023-9-13 11:26
#在这里快速回复#漠后台截图VX小程序的要VX
作者: 难解    时间: 2023-9-13 11:28
        感谢分享,很给力!~
作者: sunle818    时间: 2023-9-13 11:29

作者: 冰炎by    时间: 2023-9-13 11:51
感谢分享,很给力!~
作者: 够爱    时间: 2023-9-13 12:04
感谢分享,很给力!~
作者: idut    时间: 2023-9-13 12:04
66666666666666666666666666666666666666666
作者: zhixiao    时间: 2023-9-13 12:38
色的解决方法 [修改]
作者: ArchiverX3    时间: 2023-9-13 12:48
够仔细!
作者: melekh    时间: 2023-9-13 13:13
感谢分享,很给力!~
作者: Yonder    时间: 2023-9-13 13:47
RE: 后台截图图片黑色的解决方法 [修改]

作者: jinrong0544    时间: 2023-9-13 14:05
        感谢分享,很给力!~
作者: 阿Q3    时间: 2023-9-13 14:26
友情帮顶 顺道过来看看
作者: 兔子先生丶    时间: 2023-9-13 14:29
后台截图图片黑色的解决方法
作者: 前行易语言    时间: 2023-9-13 14:34
谢谢楼主的分享..
作者: 前行易语言    时间: 2023-9-13 14:46
楼主, 这个后台截图 我试了一下,无法运行..
找不到句柄.png

作者: weiyoucg    时间: 2023-9-13 15:32
注意:最小化,隐藏窗口无效




欢迎光临 精易论坛 (https://bbs.125.la/) Powered by Discuz! X3.4