调用API PrintWindow后台截图问题,求高手

Goodreams 2011-12-18 07:21:20
我想后台截取一个游戏窗口的图,调用PrintWindow代码如下

PrintWindow hWnd, Picture1.hDC, 0

调用后,Picture1里经常是全黑的,但偶尔能显示出游戏画面。大概几十次能成功一次。

这是什么呢?

考虑会不会是游戏窗口重绘的关系?怎么才能一次就成功截取到呢?

请高手指点,小弟先谢过了。100分奉上。
...全文
932 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
橘子皮... 2011-12-21
  • 打赏
  • 举报
回复
Directx后台截图的怎么写?
贝隆 2011-12-20
  • 打赏
  • 举报
回复
留下你邮箱,或给我站内短信
贝隆 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 lyserver 的回复:]
引用 32 楼 veron_04 的回复:

引用 31 楼 lyserver 的回复:
引用 19 楼 goodreams 的回复:

BitBlt不是得先得到hDC呀,问题现在是hDC得不到的问题

根据hWnd可以得到hDC,比如GetWindowDC

很久不见了哈,猫着发财去了?

工作中用不到VB,所以就很少来了。
[/Quote]
呵呵呵
lyserver 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 veron_04 的回复:]

引用 31 楼 lyserver 的回复:
引用 19 楼 goodreams 的回复:

BitBlt不是得先得到hDC呀,问题现在是hDC得不到的问题

根据hWnd可以得到hDC,比如GetWindowDC

很久不见了哈,猫着发财去了?
[/Quote]
工作中用不到VB,所以就很少来了。
贝隆 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 lyserver 的回复:]
引用 19 楼 goodreams 的回复:

BitBlt不是得先得到hDC呀,问题现在是hDC得不到的问题

根据hWnd可以得到hDC,比如GetWindowDC
[/Quote]
很久不见了哈,猫着发财去了?
lyserver 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 goodreams 的回复:]

BitBlt不是得先得到hDC呀,问题现在是hDC得不到的问题
[/Quote]
根据hWnd可以得到hDC,比如GetWindowDC
贝隆 2011-12-19
  • 打赏
  • 举报
回复
要读取的是什么游戏界面?按道理用BitBlt是肯定可以的。
Goodreams 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 chinayuppie 的回复:]
引用 14 楼 goodreams 的回复:
可以肯定不是句柄的事。

不过你说的
“再内存中创建一个和前台想兼容的设备场景,然后使用BitBlt来复制图片过去”

这个能实现后台截图吗?具体用哪几个API?


就是我给你说的方法啊~~~,结合BitBlt
[/Quote]

汗,a = PrintWindow(395116, Picture1.hDC, 0)
还是用PrintWindow,取不到呀,我还以为用别的API呢
booksoon 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 goodreams 的回复:]
可以肯定不是句柄的事。

不过你说的
“再内存中创建一个和前台想兼容的设备场景,然后使用BitBlt来复制图片过去”

这个能实现后台截图吗?具体用哪几个API?
[/Quote]

就是我给你说的方法啊~~~,结合BitBlt
Goodreams 2011-12-19
  • 打赏
  • 举报
回复
Private Sub Command4_Click()   '单点一下按钮大多数情况都是全黑的
Text2.Text = PrintWindow(Val(Text1.Text), Picture1.hDC, 0)
Picture1.Refresh

Text3.Text = GetPixel(Picture1.hDC, 100, 100)
End Sub

Private Sub Timer1_Timer() '我用了个Timer,间隔1毫秒,如果截图不是全黑,就停。这样大概过几秒就能截到图。时间也不准,有时候长有时候短的
Call Command4_Click

If Text3.Text <> "0" Then
Timer1.Enabled = False
End If
End Sub

Private Sub Form_Load()
Picture1.AutoRedraw = True
End Sub
贝隆 2011-12-19
  • 打赏
  • 举报
回复
能啊,不过原理上和你的这个没什么区别。
Goodreams 2011-12-19
  • 打赏
  • 举报
回复
可以肯定不是句柄的事。

不过你说的
“再内存中创建一个和前台想兼容的设备场景,然后使用BitBlt来复制图片过去”

这个能实现后台截图吗?具体用哪几个API?
贝隆 2011-12-19
  • 打赏
  • 举报
回复
再内存中创建一个和前台想兼容的设备场景,然后使用BitBlt来复制图片过去。我想应该是可以的吧?
当然PrintWindow我没怎么接触过,也许更合适你。

就你的问题,如果hwnd是正确的,那么Print出来的东西就不应该是黑屏幕啊,你加一个判断试一试?
Private Sub Command4_Click() '单点一下按钮大多数情况都是全黑的
if Val(text1.text)<>0 then
Text2.Text = PrintWindow(Val(Text1.Text), Picture1.hDC, 0)
Picture1.Refresh
Text3.Text = GetPixel(Picture1.hDC, 100, 100)
endif
End Sub
这样就避免了hwnd的是0的可能性,你试试看。

Goodreams 2011-12-19
  • 打赏
  • 举报
回复
要求台后截图,被挡住的分部也要截到
贝隆 2011-12-19
  • 打赏
  • 举报
回复
为什么不考虑使用BitBlt来获取图片呢?只需要获取桌面的DC即可。
Goodreams 2011-12-19
  • 打赏
  • 举报
回复
我不用Timer,用手点一下按钮,Picture1就是黑的

我再点一下按钮,还是黑的

我再点按钮,还是黑的

。。。。

点了N次,突然不是黑的了,得到了图。


为什么不能我第一次点钮,就得到图呢?非得点N次
贝隆 2011-12-19
  • 打赏
  • 举报
回复
你说你的Timer的Interval是多少?1ms?是不是太小了?你改成1000ms试一试
Goodreams 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chinayuppie 的回复:]
准备2个Picture窗口和一个按钮,第一个Picture后台获取整张图片,第二个用来获取需要的大小
Option Explicit
Private Declare Function PrintWindow Lib "user32" (ByVal hWnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long
Private……
[/Quote]

感谢回答,但你这跟我的问题没什么关系,我现在的问题是第一个Picture有时候取得到图,大多时候取不到,关键是怎么能让他一次就取到
Goodreams 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 veron_04 的回复:]
这个问题就要看你的Text1.text的内容了,是否是你要的正确的句柄。
[/Quote]

句柄肯定是对的,要不怎么timer几秒钟后,就截到图了呢。
booksoon 2011-12-19
  • 打赏
  • 举报
回复
准备2个Picture窗口和一个按钮,第一个Picture后台获取整张图片,第二个用来获取需要的大小
Option Explicit
Private Declare Function PrintWindow Lib "user32" (ByVal hWnd As Long, ByVal hdcBlt As Long, ByVal nFlags 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 Sub Command1_Click()
Dim a
a = PrintWindow(395116, Picture1.hDC, 0)
BitBlt Picture2.hDC, 0, 0, 300, 300, Picture1.hDC, 0, 0, vbSrcCopy
SavePicture Picture2.Image, "c:\aaa.bmp"
End Sub

注意,2个Picture窗口的AutoRedraw属性必须设置成真

加载更多回复(15)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧