我想后台截取一个游戏窗口的图,调用PrintWindow代码如下PrintWindow hWnd, Picture1.hDC, 0调用后,Picture1里经常是全黑的,但偶尔能显示出游戏画面。大概几十次能成功一次。这是什么呢?考虑会不会是游戏窗口重绘的关系?怎么才能一次就成功截取到呢?请高手指点,小弟先谢过了。100分奉上。

解决方案 »

  1.   

    设置:
    Picture1.autoredraw=True
      

  2.   

    本帖最后由 bcrun 于 2011-12-23 15:26:22 编辑
      

  3.   

    这个问题就要看你的Text1.text的内容了,是否是你要的正确的句柄。
      

  4.   

    本帖最后由 bcrun 于 2011-12-23 15:27:50 编辑
      

  5.   


    句柄肯定是对的,要不怎么timer几秒钟后,就截到图了呢。
      

  6.   


    感谢回答,但你这跟我的问题没什么关系,我现在的问题是第一个Picture有时候取得到图,大多时候取不到,关键是怎么能让他一次就取到
      

  7.   

    你说你的Timer的Interval是多少?1ms?是不是太小了?你改成1000ms试一试
      

  8.   

    我不用Timer,用手点一下按钮,Picture1就是黑的我再点一下按钮,还是黑的我再点按钮,还是黑的。点了N次,突然不是黑的了,得到了图。
    为什么不能我第一次点钮,就得到图呢?非得点N次
      

  9.   

    为什么不考虑使用BitBlt来获取图片呢?只需要获取桌面的DC即可。
      

  10.   

    再内存中创建一个和前台想兼容的设备场景,然后使用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的可能性,你试试看。
      

  11.   

    可以肯定不是句柄的事。不过你说的
    “再内存中创建一个和前台想兼容的设备场景,然后使用BitBlt来复制图片过去”这个能实现后台截图吗?具体用哪几个API?
      

  12.   


    就是我给你说的方法啊~~~,结合BitBlt
      

  13.   


    汗,a = PrintWindow(395116, Picture1.hDC, 0)
    还是用PrintWindow,取不到呀,我还以为用别的API呢
      

  14.   

    要读取的是什么游戏界面?按道理用BitBlt是肯定可以的。
      

  15.   

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

  16.   

    你有个hwnd不就可以得到hdc?
    GetDC函数可以实现的
      

  17.   

    说到GetDC,我也试了在VC那边开贴问的.问题是这样的正常使用 GetDC,如果窗口被挡住,是得到不指定窗口的图的。但我发现用一个叫大漠后台的插件先绑定窗口后,再用GetDC该窗口,就算被挡住也能得到该窗口的图。求教,是用什么方法,可以让GetDC取到后台窗口的图的呢?1、是改了窗口属性?我用spy++查了,也没发现有什么变化2、是Hook API?我查了要截图的窗口进程,也没发现插件的DLL驻入进去3、是跟窗口刷新的有效区、无效区有关吗?这个我不太懂http://topic.csdn.net/u/20111219/10/4bcccc45-e591-424a-83f4-850e99aa4507.html
      

  18.   

    我感觉PrintWindow其实不错,现在问题的关键在于我搞不清楚这个函数最后一个参数的作用,是不是它影响了执行结果?还是什么的。
      

  19.   

    AutoRedraw设置为True了
    PrintWindow之后,也Refresh了,我在我的电脑上测试是没有问题的。还真就不知道为什么了。
      

  20.   

    啊哦,感觉Directx后台截图,是不是更难实现?您有现成的代码吗?
      

  21.   

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