我想获取主窗口背后的那块的桌面背景,应该怎么样得到呢?多谢牛人了
只有25分了啊啊啊啊

解决方案 »

  1.   

    获得desktop的DC,然后根据当前窗口的屏幕坐标bitblt应该可以吧?
      

  2.   

    得一下explore的窗口DC或许可以
      

  3.   

    显然不可能,因为只有桌面接收到WM_PAINT消息时才会去绘制,除非你先隐藏窗口,然后Bitblt,然后再显示窗口,Windows出于节省资源考虑,是不会去保存被遮盖的窗口的内容的。
      

  4.   

      支持六楼:
      
        在窗口创立,但没有SHow()之前将背景存入窗口的变量CBitmap m_bitmap中    窗口类定义
         CMyFram : public CFrame
        {
           public:
           CRect   m_rect;
           CBitmap m_bitmap
          .........
        }
        1)在窗口Create重载之后
        CMyFram ::OnCreate()
        {  
            Create(..,m_rect,..);
            CDC *pDC =  获得desktop的DC;
            m_bitmap <- GetBItmap(pDC,m_rect); //获得desktop的m_rect对应图
        }   这样一来,m_bitmap自然就是背景图啦.
      

  5.   

    我先hide自身窗体,然后得到桌面hwnd,然后得到dc,然后Bitblt.然后显示自身窗体. 我写截屏器时就这样做的.
      

  6.   

    这个问题在WIN9X基本没解决方案,但是在之后的系统倒有可能,不过没来得及研究,是偶尔发现的,做的半透明窗口,用WINVNC远程的时候,发现不管透明度是多少,窗体完全透明了,但是鼠标按对位置,远程机器上的窗口是有反应的,这应该是VNC的BUG,但是却给LZ的需求带来希望,需要研究一下VNC是如何截图的。
      

  7.   

    问题不在于VNC是怎么截图的,而是如何绘制的,估计VNC可能是用驱动级的直接绘制,凌驾于GDI之上,所以它到底点了部分是不是自己,Explorer不知道。
      

  8.   

    抱歉,我忘记考虑一样东西了……
    从Windows 2000后有了分层窗口,可以直接Bitblt桌面。只要把你自己的窗口设置成WS_EX_LAYERED,的Alpha值
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^WS_EX_LAYERED); 
    SetLayeredWindowAttributes(this->m_hWnd, 0, 254, LWA_ALPHA); 
    这样Bitblt就可以截取到后面的背景。但是这个在Vista之后不起作用了,估计要利用DWM的相关功能
      

  9.   

    仔细查了一下,找到这个:
    http://blogold.chinaunix.net/u2/67530/showart_601835.html
    可以先获得桌面DC,关联一个位图,然后送一个WM_PAINT就把桌面绘制到位图上去了……貌似是兼容性最好的方法了。不用管DWM……
      

  10.   

    BitBlt时dwRop如果设置了CAPTUREBLT,就会把Layered window也Copy过去,否则会忽略Layered window
      

  11.   

    LZ可以试下这个解决方案,让Parent Window响应WM_PRINTCLIENT,Child window在Paint的时候向Parent window发送WM_PRINTCLIENT以获取该区域的Bitmap,然后作为背景Paint到Child Window
      

  12.   

    先获取窗体区域,然后用PrintWindow API获取桌面的图,然后自己按照窗体区域裁剪一下就可以了
      

  13.   

    很简单,因为有这个api函数.
    PaintDesktop(),直接用就可以了.
    好用.
      

  14.   

    注入explorer.exe,没发现什么好方法提示一下桌面图标,要是做产品,就要好好考虑一下,不是那么简单的,太痛苦了
      

  15.   

    向桌面窗口发WM_Print消息即可。
    或是调用PrintWindow函数(其实其内部也是发WM_Print消息)。
      

  16.   

    把桌面上的图标移一下,截几张图,在photoshop里处理一下就好了
      

  17.   

    switch (message)
    {
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    PaintDesktop(hdc);
                    //该PaintDesktop   API可以无视当前桌面上的其他窗体的累加,直接将桌面最原始的背景拷贝到你的HDC上,曾经一直被这问题困扰很久,呵呵,不过这个函数只能拷贝背景,拷贝不了其他的东西的,比如:WINDOWS桌面有很多图标什么的,这些是拷贝不进去的。 EndPaint(hWnd, &ps);
    break;
            }
      

  18.   

    果然很简单 测试OK.....
    我的是WIN7  XP应该也一样
    int Proc()
    {
    HWND hWnd = FindWindow(TEXT("Progman"),TEXT("Program Manager"));
    HDC hDc = GetDC(hWnd);
    BitBlt(hMyDC,0,0,300,300,hDc,50,50,SRCCOPY );
    return 0;
    }
    全都最大化也可以截取到屏幕