如何获取当前屏幕某个区域的截图

时间:2023-01-28 15:26:11
如何获取当前屏幕某个区域的截图,比如 100,100 - 200,200
目前的网上很多写法,遇到这个区域有QQ窗口的话,就抓不出来 如何获取当前屏幕某个区域的截图

20 个解决方案

#1


有“很多种定法”???
如何获取当前屏幕某个区域的截图

反正我会的大概就是这种了,刚才试了,QQ窗口的也是抓下来了的。
如何获取当前屏幕某个区域的截图

#2


我是不是应该放张“全屏”的图片,这样容易看出效果点?
如何获取当前屏幕某个区域的截图

#3


你这个写法早就试过了,不行,不知道为什么,其他可以,qq窗体就抓不到,抓到的是后面的句柄,如图

#4


如何获取当前屏幕某个区域的截图

#5



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 GetDesktopWindow Lib "user32" () As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hiWnd As Long, ByVal hds As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Sub Command1_Click()
    Dim hWndDesk As Long
    Dim hDC_Screen As Long
    Dim cx&, cy&, cw&, ch As Long
    
    cw = 500
    ch = 500
    
    cx = 0
    cy = 0
    
    
    hWndDesk = GetDesktopWindow()
    hDC_Screen = GetDC(0)
    
    BitBlt Picture1.hDC, 0&, 0&, cw, ch, hDC_Screen, cx, cy, &HCC0020
    ReleaseDC hWndDesk, hDC_Screen
    
    Picture1.Refresh
End Sub


我是win7  64

#6


我KAO!居然会有这种效果?
QQ的聊天窗口在前面,屏幕抓图时相当于“透明”的!
有时候,我想要这种效果,还没法达到呢…………  如何获取当前屏幕某个区域的截图

我昨晚上试的时候,是QQ的主窗口。
等下有空我再把代码重新写好,测试一下聊天窗口的效果。

我的也是Win7、64位,SP1旗舰版

#7


用高清摄像头对着屏幕拍!
我就不信BAT哪家的技术能防止我拍到!!
如何获取当前屏幕某个区域的截图

#8


我刚才试了,聊天窗口仍然能被抓下来啊……
如何获取当前屏幕某个区域的截图

如何获取当前屏幕某个区域的截图

#9


如何获取当前屏幕某个区域的截图

我他么的也是无语了,你用的是我的代码么?没写错吧

#10


“你的代码”,跟我的代码,有实质区别么!

hDC_Screen = GetDC(hWndDesk) 和 hDC_Screen = GetDC(0)
我都试过了,在我这儿,什么窗口都能抓下来……

#11


再发张图片吧。
这里面,可以看到QQ聊天窗口、媒体播放器播放的Mp4视频、我用APlayer接口写的视频播放器窗口,
都是正常“抓”下来了的。
如何获取当前屏幕某个区域的截图

#12


引用 10 楼 Chen8013 的回复:
“你的代码”,跟我的代码,有实质区别么!

hDC_Screen = GetDC(hWndDesk) 和 hDC_Screen = GetDC(0)
我都试过了,在我这儿,什么窗口都能抓下来……


不行,0是我后来改的,hWndDesk也不行,奇怪了

#13


引用 12 楼 wowfiowow 的回复:
Quote: 引用 10 楼 Chen8013 的回复:

“你的代码”,跟我的代码,有实质区别么!

hDC_Screen = GetDC(hWndDesk) 和 hDC_Screen = GetDC(0)
我都试过了,在我这儿,什么窗口都能抓下来……


不行,0是我后来改的,hWndDesk也不行,奇怪了

刚才我在QQ群里说这个,老马怀疑是“进程权限”问题。
你的VB6的进程权限,跟QQ的是否一样?

比如你的VB6设置了“兼容模式”,启动时是会“以管理员身份运行”启动的,而QQ是“正常启动”的?

#14


我这儿,那些程序窗口的进程的权限是一样的。
都是“当前用户”的标准权限(普通的“管理员”)。

#15


我刚才试验出原因了:

你的VB6是设置了“以兼容模式运行”、并钩选了“禁用桌面元素”的。
而我的VB6是“正常模式”运行的。

你可以试试:编译成exe、退出VB6,让系统恢复“正常状态”。
然后,运行刚才编译好的exe程序来操作,就可以了。
如何获取当前屏幕某个区域的截图

#16


https://bbs.csdn.net/topics/390847962

这个是正解

#17


引用 16 楼 PctGL 的回复:
https://bbs.csdn.net/topics/390847962

这个是正解


看起来是个好办法…………

可惜,对楼主遇到的情况,好像无效!  如何获取当前屏幕某个区域的截图
最后那个参数,&H40000000、&H80000000、&HC0000000我都试过…………
如何获取当前屏幕某个区域的截图

上图左边就是“被Copy区域”,右边是程序的窗口。
Copy下来的图像,仍然“透过QQ窗口”,看到我写的代码了。

#18


vbSrcCopy = &HCC0020

#19


如何获取当前屏幕某个区域的截图
如何获取当前屏幕某个区域的截图
如何获取当前屏幕某个区域的截图

#20


谢谢各位的热情回复,Call BitBlt(Picture1.hDC, 0, 0, w, h,  hDCtmp, 0, 0, vbSrcCopy Or &H40000000)本来我也测试了
结果是一片漆黑什么都抓不到,然后神奇的事情发生了,我改回去然后又从加上 &H40000000,结果。。。。可以抓到了,晕啦 如何获取当前屏幕某个区域的截图


如何获取当前屏幕某个区域的截图
抓图纪念下,呵呵

#1


有“很多种定法”???
如何获取当前屏幕某个区域的截图

反正我会的大概就是这种了,刚才试了,QQ窗口的也是抓下来了的。
如何获取当前屏幕某个区域的截图

#2


我是不是应该放张“全屏”的图片,这样容易看出效果点?
如何获取当前屏幕某个区域的截图

#3


你这个写法早就试过了,不行,不知道为什么,其他可以,qq窗体就抓不到,抓到的是后面的句柄,如图

#4


如何获取当前屏幕某个区域的截图

#5



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 GetDesktopWindow Lib "user32" () As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hiWnd As Long, ByVal hds As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Sub Command1_Click()
    Dim hWndDesk As Long
    Dim hDC_Screen As Long
    Dim cx&, cy&, cw&, ch As Long
    
    cw = 500
    ch = 500
    
    cx = 0
    cy = 0
    
    
    hWndDesk = GetDesktopWindow()
    hDC_Screen = GetDC(0)
    
    BitBlt Picture1.hDC, 0&, 0&, cw, ch, hDC_Screen, cx, cy, &HCC0020
    ReleaseDC hWndDesk, hDC_Screen
    
    Picture1.Refresh
End Sub


我是win7  64

#6


我KAO!居然会有这种效果?
QQ的聊天窗口在前面,屏幕抓图时相当于“透明”的!
有时候,我想要这种效果,还没法达到呢…………  如何获取当前屏幕某个区域的截图

我昨晚上试的时候,是QQ的主窗口。
等下有空我再把代码重新写好,测试一下聊天窗口的效果。

我的也是Win7、64位,SP1旗舰版

#7


用高清摄像头对着屏幕拍!
我就不信BAT哪家的技术能防止我拍到!!
如何获取当前屏幕某个区域的截图

#8


我刚才试了,聊天窗口仍然能被抓下来啊……
如何获取当前屏幕某个区域的截图

如何获取当前屏幕某个区域的截图

#9


如何获取当前屏幕某个区域的截图

我他么的也是无语了,你用的是我的代码么?没写错吧

#10


“你的代码”,跟我的代码,有实质区别么!

hDC_Screen = GetDC(hWndDesk) 和 hDC_Screen = GetDC(0)
我都试过了,在我这儿,什么窗口都能抓下来……

#11


再发张图片吧。
这里面,可以看到QQ聊天窗口、媒体播放器播放的Mp4视频、我用APlayer接口写的视频播放器窗口,
都是正常“抓”下来了的。
如何获取当前屏幕某个区域的截图

#12


引用 10 楼 Chen8013 的回复:
“你的代码”,跟我的代码,有实质区别么!

hDC_Screen = GetDC(hWndDesk) 和 hDC_Screen = GetDC(0)
我都试过了,在我这儿,什么窗口都能抓下来……


不行,0是我后来改的,hWndDesk也不行,奇怪了

#13


引用 12 楼 wowfiowow 的回复:
Quote: 引用 10 楼 Chen8013 的回复:

“你的代码”,跟我的代码,有实质区别么!

hDC_Screen = GetDC(hWndDesk) 和 hDC_Screen = GetDC(0)
我都试过了,在我这儿,什么窗口都能抓下来……


不行,0是我后来改的,hWndDesk也不行,奇怪了

刚才我在QQ群里说这个,老马怀疑是“进程权限”问题。
你的VB6的进程权限,跟QQ的是否一样?

比如你的VB6设置了“兼容模式”,启动时是会“以管理员身份运行”启动的,而QQ是“正常启动”的?

#14


我这儿,那些程序窗口的进程的权限是一样的。
都是“当前用户”的标准权限(普通的“管理员”)。

#15


我刚才试验出原因了:

你的VB6是设置了“以兼容模式运行”、并钩选了“禁用桌面元素”的。
而我的VB6是“正常模式”运行的。

你可以试试:编译成exe、退出VB6,让系统恢复“正常状态”。
然后,运行刚才编译好的exe程序来操作,就可以了。
如何获取当前屏幕某个区域的截图

#16


https://bbs.csdn.net/topics/390847962

这个是正解

#17


引用 16 楼 PctGL 的回复:
https://bbs.csdn.net/topics/390847962

这个是正解


看起来是个好办法…………

可惜,对楼主遇到的情况,好像无效!  如何获取当前屏幕某个区域的截图
最后那个参数,&H40000000、&H80000000、&HC0000000我都试过…………
如何获取当前屏幕某个区域的截图

上图左边就是“被Copy区域”,右边是程序的窗口。
Copy下来的图像,仍然“透过QQ窗口”,看到我写的代码了。

#18


vbSrcCopy = &HCC0020

#19


如何获取当前屏幕某个区域的截图
如何获取当前屏幕某个区域的截图
如何获取当前屏幕某个区域的截图

#20


谢谢各位的热情回复,Call BitBlt(Picture1.hDC, 0, 0, w, h,  hDCtmp, 0, 0, vbSrcCopy Or &H40000000)本来我也测试了
结果是一片漆黑什么都抓不到,然后神奇的事情发生了,我改回去然后又从加上 &H40000000,结果。。。。可以抓到了,晕啦 如何获取当前屏幕某个区域的截图


如何获取当前屏幕某个区域的截图
抓图纪念下,呵呵

#21