我用Findwindow获得窗口句柄成功,但接着用getDc总是反回0 
但用在别的窗口上能成功,不知道为什么~~~
用spy++看了一下,是这个样子
001101DE 00000000 '小游戏' Afx:00400000:b 可见a = FindWindow(vbNullString, "小游戏") 成功
myhdc& = GetDC(a) 失败哪位高人能给解释一下啊~~
我就是想实时的抓这个窗口的图,再在里面画点东西。

解决方案 »

  1.   

    你试试用bitblt进行全屏复制看有没有那个窗体部分的图像,如果没有可能是用dx画上去的。
      

  2.   

    bitblt全屏复制可以抓到~~
    用ALT+Print screen也能抓到这个窗口的图~~~
    但就是getDC不行~~
      

  3.   

    1.试试a = FindWindow(0&, "小游戏")
    2.确认句柄找准了,用spy++看看下面是否还有子窗体,图形可能显示在子窗体内。。用findwindowex可得到子窗体句柄
    3.debug.print a  看看a的值是否正常变量a的类型定义一定要是long。
      

  4.   

    001101DE 00000000 '小游戏'Afx:00400000:b 可见
    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哪一个都不能成功
      

  5.   

    上面有两个'output window' ,找它们的句柄试试,以前我用的是myspy,有隐藏/显示控件的功能。你可以试试,把你找到的控件隐藏掉,看图像还在不在就知道是那个控件在显示图形了,但要注意一定要从最深一级的控件开始试起,不然一开始就把窗口给隐藏掉,图形是没有了,但没有意义
      

  6.   

    抓图倒好办,用sendmessage发送wm_print消息应该就可以了,想再画点东西,恐怕就要线程注入了
      

  7.   

    你的GetDC会失败是当然的,因为你得到的句柄不在你的程序的进程中。
    句柄是内核对象,句柄值与进程密切相关的。如果你将这个句柄值传给另一个进程中的线程使用,那么对这个句柄值的所有调用都会失败。(使用其它技术除外)
      

  8.   

    你的GetDC会失败是当然的,因为你得到的句柄不在你的程序的进程中。
    句柄是内核对象,句柄值与进程密切相关的。如果你将这个句柄值传给另一个进程中的线程使用,那么对这个句柄值的所有调用都会失败。(使用其它技术除外)
    ===================
    某些特殊的api是这样的,但不见得很多吧。如果真是这样,那么vb能用的api就真是寥寥无几了。
      

  9.   

    你的GetDC会失败是当然的,因为你得到的句柄不在你的程序的进程中
    =============================================================
    GDI Api是整个Windows系统都有效的,没看见经常用GetDC(0)取得桌面DC吗只有Kernel Api的句柄才是进程级的我估计GetDC失败的原因是:
    一、该窗口不属于可见区域。可能是被其他窗口遮住了
    二、那是DirectX窗口
      

  10.   

    你失败后,请最好是调用GetLastError取得错误说明,当然,如果你直接在VB中使用声明的方式调用API的话,直接访问Err.LastDllError,然后根据这个值再看原因吧。
      

  11.   

    001101DE 00000000 '小游戏'Afx:00400000:b 可见
    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到窗口的图就行.~~~~~谢谢大家了
      

  12.   

    a = FindWindow(vbNullString, "茄霸烙 7器目")
    为a = FindWindow(vbNullString, "小游戏")
    上面的写错了~~不好意思
      

  13.   

    实在不行的话:
    用GetDC(0)获得屏幕DC,用GetWindowRect得到该窗口在屏幕上的位置,再直接在屏幕上画
      

  14.   

    //不管想什么办法,只要能bitblt到窗口的图就行.~~~~~谢谢大家了看看这里:
    http://www.china-askpro.com/msg2/qa05.shtml
      

  15.   

    先谢谢大家的回复~~GetDC(0)获得屏幕DC再GetWindowRect得到该窗口在屏幕上的位置,但抓图失败
    经过实验发现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才能下载才能玩
      

  16.   

    //这是个韩国的游戏~~只有有韩国的IP才能下载才能玩
    果然一般游戏窗口都是DirectX窗口
    不能用GDI函数截屏的
    由于WindowsXP为了支持快速切换
    所以它有时会自动将DirectX中的图像复制到桌面
    而直接Bitblt不会触发它的自动复制功能
      

  17.   

    没其他办法只能挂接DirectX API,技术难度极高
    由于内容太多,在这里就不细说了,你去网上搜索一下就知道了