完整程序:
http://download.csdn.net/detail/maverick432/8457633
(其实没几行代码,为啥vs2010生成的工程这么大,都哪些可以删啊)主要代码:
void CShowHBITMAPDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
CWnd *wnd = FindWindow(NULL, m_strCaption);
if(wnd)
{
m_strInfo.Format(_T("找到窗口的hWnd为 %d"), (long)wnd->m_hWnd);
CFileDialog fd(TRUE, NULL, NULL, NULL, _T("bmp(*.bmp)|*.bmp||"));
if(fd.DoModal())
{
HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), fd.GetPathName(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
CBitmap bitmap;    
bitmap.Attach(hBitmap); //关联位图对象
CDC* pDC = wnd->GetDC();
CDC dcimage;
dcimage.CreateCompatibleDC(pDC); //内存DC
BITMAP bmp;
bitmap.GetBitmap(&bmp); //获取位图信息
dcimage.SelectObject(&bitmap); //选取位图对象
CRect rect;
wnd->GetClientRect(&rect);
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dcimage, 0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY); //显示
DeleteObject(hBitmap);
}
}
else
{
m_strInfo = _T("没有找到窗口");
}
UpdateData(FALSE);
}效果:
但是因为不是自己的程序,没法处理WM_PAINT,所以只要窗口一重绘图像就被破坏了

解决方案 »

  1.   

    子类化你要处理的窗口,然后在 WM_ERASEBKGND消息里将图片贴进去。
      

  2.   

    请问为什么我这样不行呢
       HWND hw1=FindWindow(0,"MFCPic");MFCPic 是我当前窗口 ,窗口上就2个按钮 ,还有一片空白
    void OnBnClickedOk(HBITMAP hBitmap)
    {
    CString m_strInfo;
        // TODO: 在此添加控件通知处理程序代码
       HWND hw1=FindWindow(0,"MFCPic");
        CWnd *wnd =CWnd::FromHandle(hw1);
        if(wnd)
        {
           
     m_strInfo.Format(_T("找到窗口的hWnd为 %x"), (long)wnd->m_hWnd);
     AfxMessageBox(m_strInfo); //句柄没问题
                SaveBitmapToFile(hBitmap,"c:\\333.bmp"); //图像没问题
                CBitmap bitmap;    
                bitmap.Attach(hBitmap); //关联位图对象
                CDC* pDC = wnd->GetDC();
                CDC dcimage;
                dcimage.CreateCompatibleDC(pDC); //内存DC
                BITMAP bmp;
                bitmap.GetBitmap(&bmp); //获取位图信息
                dcimage.SelectObject(&bitmap); //选取位图对象
                CRect rect;
                wnd->GetClientRect(&rect);
                pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dcimage, 0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY); //显示
                DeleteObject(hBitmap);
            
        }
        else
        {
           
     MessageBox(0,"FromHandle",0,0);
        }
       
    }
      

  3.   

    请问为什么我这样不行呢
       HWND hw1=FindWindow(0,"MFCPic");MFCPic 是我当前窗口 ,上面就2个按钮 还有y
    void OnBnClickedOk(HBITMAP hBitmap)
    {
    CString m_strInfo;
        // TODO: 在此添加控件通知处理程序代码
       HWND hw1=FindWindow(0,"MFCPic");
        CWnd *wnd =CWnd::FromHandle(hw1);
        if(wnd)
        {
           
     m_strInfo.Format(_T("找到窗口的hWnd为 %x"), (long)wnd->m_hWnd);
     AfxMessageBox(m_strInfo); //句柄没问题
                SaveBitmapToFile(hBitmap,"c:\\333.bmp"); //图像没问题
                CBitmap bitmap;    
                bitmap.Attach(hBitmap); //关联位图对象
                CDC* pDC = wnd->GetDC();
                CDC dcimage;
                dcimage.CreateCompatibleDC(pDC); //内存DC
                BITMAP bmp;
                bitmap.GetBitmap(&bmp); //获取位图信息
                dcimage.SelectObject(&bitmap); //选取位图对象
                CRect rect;
                wnd->GetClientRect(&rect);
                pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dcimage, 0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY); //显示
                DeleteObject(hBitmap);
            
        }
        else
        {
           
     MessageBox(0,"FromHandle",0,0);
        }
       
    }
      

  4.   

    FindWindow 找到目标窗口
    SetWindowLong 给目标窗口设置新的消息处理回调函数
    在消息函数中处理 WM_ERASEBKGND 及 WM_PAINT 消息注意任何一个窗口退出时及时调用 SetWindowLong 将原来的窗口消息函数设置回去
      

  5.   

    对于其他进程的窗口可以先将dll注入到相关进程然后通过SetWindowLong子类化窗口,然后在WM_ERASEBKGND消息中将图片贴到窗口上。
    dll注入:http://pnig0s1992.blog.51cto.com/393390/804484/ 
    窗口子类化:http://blog.csdn.net/lwbeyond/article/details/5393495
      

  6.   


    你好 根据您提供的子类化思路,现在又出现个问题 麻烦在帮忙看下 谢谢
    http://bbs.csdn.net/topics/390989558