前天发的贴子,截取一个应用程序窗口,但该窗口部分被遮住。参照 www.fengyuan.com网上的例子已经解决。
谢谢大家的支持,这个问题已经已经解决,但是窗口如果被最小化后,还是不能截图,在不把窗口还原的情况下,有没有什么办法截图?
关于MoveWindow、SetWidowPos把窗口移到屏幕外面,我都已经试过了,可惜的是这两个API都必须先把窗口还原后才能移动,有没有办法不还原窗口又能截图的好办法?

解决方案 »

  1.   

    另外,还有一个问题,我用主程序去截取另一个窗口的画面,可以截取成功,但是当我先关掉主程序窗口时,另一个窗口会报非法操作,所以我只能先关掉被截图的窗口,然后再关主程序。
    说明一点,我的主程序在退出时自动释放钩子、释放DLL。为什么还会出现这个问题,高手们,帮帮我,急!!!!!!!!!!!!!!!!!!!!
      

  2.   

    不用那么麻烦吧,抓图哪用搞那么多东西。
    你新建一个工程,放入下面几行代码运行看看,当你用鼠标点击窗口就可以抓图了Private Declare Function GetDesktopWindow Lib "user32" () 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 Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetTickCount Lib "kernel32" () As Long
    Private Sub Form_Click()
       Dim saveTime As Long
       Me.WindowState = 1
       saveTime = GetTickCount
       Do
          DoEvents
       Loop While GetTickCount - saveTime < 100
       Me.AutoRedraw = True
       BitBlt Me.hDC, 0, 0, Screen.Width / 15, Screen.Height / 15, _
              GetWindowDC(GetDesktopWindow), 0, 0, vbSrcCopy
       Me.Refresh
       Me.WindowState = 0
    End Sub
      

  3.   

    不好意思,忘记是看VC的了,答了个VB的,呵呵
      

  4.   

    SupermanKing(人类) 大哥,你在开玩笑吧,BITBLT能实现这种抓图吗?我的前提是被抓的窗口已经最小化了,你的BITBLT只能抓已经正常显示且没有被遮住的窗口,你没有试过吗?
    呵呵,不过我还是很感谢你!
    希望我们能一起研究研究这个课题!
      

  5.   

    第一个问题不知道。
    第二个问题你的DLL没有在其他进程中创建窗口什么的吧?如果创建了必须要关闭掉之后,才能释放DLL。我遇到过这种问题。
      

  6.   

    erdgzw(编译通过那一刻感觉真好) 第一个问题不知道。
    第二个问题你的DLL没有在其他进程中创建窗口什么的吧?如果创建了必须要关闭掉之后,才能释放DLL。我遇到过这种问题。----------------------------------------------------------------------------------DLL里面没有创建窗口
      

  7.   

    截图之前hook IsIconic这个api,始终返回FALSE。截图之后恢复。
      

  8.   

    没有做过,不知道使用windowdc可不可以?
      

  9.   

    freeheart1977(逍遥的心) 把窗口内容重绘到内存里面----------------------------------------------------你有没有试过,窗口已经最小化了,怎么重绘?
      

  10.   

    LiveALearn(研究GDI) 如果你的窗口上没使用微软的控件,可以在打印前把当前需要绘制的图像自己绘制到一个内存DC上,然后打印.
    或者打印之前判断一下窗口是否最小化,如果是就提示用户或者强制将窗口恢复,在打印.--------------------------------------------------------------------------------我的目的就是不要将窗口打开,而进行截图!
      

  11.   

    不知道你这样做有什么意思,不过我说一个方法,虽然我没试过,但应该可行,就是HOOK BeginPaint 和 EndPaint或的更多的API, 然后给该窗口发送WM_PAINT消息