我用Findwindow获得窗口句柄成功,但接着用getDc总是反回0
但用在别的窗口上能成功,不知道为什么~~~
用spy++看了一下,是这个样子
001101DE 00000000 '小游戏' Afx:00400000:b 可见a = FindWindow(vbNullString, "小游戏") 成功
myhdc& = GetDC(a) 失败哪位高人能给解释一下啊~~
我就是想实时的抓这个窗口的图,再在里面画点东西。
但用在别的窗口上能成功,不知道为什么~~~
用spy++看了一下,是这个样子
001101DE 00000000 '小游戏' Afx:00400000:b 可见a = FindWindow(vbNullString, "小游戏") 成功
myhdc& = GetDC(a) 失败哪位高人能给解释一下啊~~
我就是想实时的抓这个窗口的图,再在里面画点东西。
解决方案 »
- 在VB里怎么引入外部控件
- 如何设置MDI的子窗体在程序开始运行时的出现位置?
- 求求个位大虾能够详解这个(不然拿不到毕业证啊!!),我没有分了,全送了!
- 找VB爱好者?能交个朋友吗?
- 大家能不能帮我解决这样的问题?
- +++++已知一个公司网站, 如何搜索或抓取到上面的联系邮件?+++
- vba中怎么用正则表达式.
- 如何在客户端通过VB注册一个升级DLL,并且要自动识别出98或者是2000的安装目录,将Dll覆盖并升级 要有获取路径和注册的例子 高分送上
- 数据库联结问题!!!
- VB中备份与恢复找不到匹配项怎么解决
- 如何写代码 要求一个按钮单击 打开某个以EXE结尾的程序文件
- 请大家帮帮我,谢谢。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
用ALT+Print screen也能抓到这个窗口的图~~~
但就是getDC不行~~
2.确认句柄找准了,用spy++看看下面是否还有子窗体,图形可能显示在子窗体内。。用findwindowex可得到子窗体句柄
3.debug.print a 看看a的值是否正常变量a的类型定义一定要是long。
000103DA 'game' Afx:00400000:8 可见
000103DC 'PokerBoardWnd' Afx:00400000:3:00000000:00000006:00000000 可见
00010418 'imgChatSetWindow' Afx:00400000:8:00010011:00000000:00000000 可见
0001041A '' Edit 可见
00010414 'imgChatSetWindow' Afx:00400000:8:00010011:00000000:00000000 可见
00010416 'output window' Afx:00400000:0:00010011:00000000:00000000 可见
00010410 'imgChatSetWindow' Afx:00400000:8:00010011:00000000:00000000 不可见
00010412 'output window' Afx:00400000:0:00010011:00000000:00000000 不可见
000103DE '' Button 可见a = FindWindow(vbNullString, "小游戏")
b = FindWindowEx(a, 0, vbNullString, "game")
b = FindWindowEx(a, 0, "Button", vbNullString)
c = FindWindowEx(b, 0, vbNullString, "PokerBoardWnd")
d = FindWindowEx(c, 0, vbNullString, "imgChatSetWindow")a b c d 均可获得正确句柄~但getDC哪一个都不能成功
句柄是内核对象,句柄值与进程密切相关的。如果你将这个句柄值传给另一个进程中的线程使用,那么对这个句柄值的所有调用都会失败。(使用其它技术除外)
句柄是内核对象,句柄值与进程密切相关的。如果你将这个句柄值传给另一个进程中的线程使用,那么对这个句柄值的所有调用都会失败。(使用其它技术除外)
===================
某些特殊的api是这样的,但不见得很多吧。如果真是这样,那么vb能用的api就真是寥寥无几了。
=============================================================
GDI Api是整个Windows系统都有效的,没看见经常用GetDC(0)取得桌面DC吗只有Kernel Api的句柄才是进程级的我估计GetDC失败的原因是:
一、该窗口不属于可见区域。可能是被其他窗口遮住了
二、那是DirectX窗口
000103DA 'game' Afx:00400000:8 可见
000103DC 'PokerBoardWnd' Afx:00400000:3:00000000:00000006:00000000 可见
00010418 'imgChatSetWindow' Afx:00400000:8:00010011:00000000:00000000 可见
0001041A '' Edit 可见
00010414 'imgChatSetWindow' Afx:00400000:8:00010011:00000000:00000000 可见
00010416 'output window' Afx:00400000:0:00010011:00000000:00000000 可见
00010410 'imgChatSetWindow' Afx:00400000:8:00010011:00000000:00000000 不可见
00010412 'output window' Afx:00400000:0:00010011:00000000:00000000 不可见
000103DE '' Button 可见a = FindWindow(vbNullString, "茄霸烙 7器目")
b = FindWindowEx(a, 0, vbNullString, "game")
c = FindWindowEx(b, 0, vbNullString, "PokerBoardWnd")
d = FindWindowEx(c, 0, vbNullString, "imgChatSetWindow")
e = FindWindowEx(c, d, vbNullString, "imgChatSetWindow")
f = FindWindowEx(e, 0, vbNullString, "output window")
'Debug.Print b
Print a
Print b
Print c
Print d
Print e
Print f
mhdc& = GetDC(f)
Print Err.LastDllErrora b c d e f 均可得到正确的句柄,但getdc 哪一个都失败,Err.LastDllError为5窗口处于可见区域
bitblt全屏复制可以抓到~~
用ALT+Print screen也能抓到这个窗口的图~~~
但就是getDC不行~~用myspy看不到game,PokerBoardWnd,imgChatSetWindow,output window等窗体标题,
能看到的类名全部为Afx:00400000......
使用其隐藏/显示控件的功能也没反映。
查看窗口的消息全部为WM_USER 31941 lparam wparam两参数值全为0000000到底是怎么回事啊~~~~不管想什么办法,只要能bitblt到窗口的图就行.~~~~~谢谢大家了
为a = FindWindow(vbNullString, "小游戏")
上面的写错了~~不好意思
用GetDC(0)获得屏幕DC,用GetWindowRect得到该窗口在屏幕上的位置,再直接在屏幕上画
http://www.china-askpro.com/msg2/qa05.shtml
经过实验发现MyRect为这个窗口
BitBlt PicMake.hdc, 0, 0, 680, 530, mhdc&, MyRect.Left, MyRect.Top , vbSrcCopy 失败
但BitBlt PicMake.hdc, 0, 0, 680, 530, mhdc&, MyRect.Left, MyRect.Top-1 , vbSrcCopy
能成功~~也 就是直接BitBlt窗口里的任意一点或一个区域都失败,但如果连同窗口外面一点区域一起抓就能成功~~~大家能说说是为什么吗~~~
还有就是为什么用ALT+Print screen能抓到这个窗口的图
ALT+Print screen是什么原理呢~~谢谢大家了~~这是个韩国的游戏~~只有有韩国的IP才能下载才能玩
果然一般游戏窗口都是DirectX窗口
不能用GDI函数截屏的
由于WindowsXP为了支持快速切换
所以它有时会自动将DirectX中的图像复制到桌面
而直接Bitblt不会触发它的自动复制功能
由于内容太多,在这里就不细说了,你去网上搜索一下就知道了