关于VC++用API截屏有关问题

关于VC++用API截屏问题
我用VC++(VC6.0和VS)写一个截屏程序。
为什么在有些电脑就能截到当前屏幕显示的所有东西,而有些电脑却截不到全部呢?(例如QQ登录界面啊,工具条啊),截不到不是变黑,而是跟正常一样,只不过哪个窗口没显示出来,而被桌面背景代替。 感到十分奇怪,并不是像别人说的黑屏情况啊,求如何解决?
这是代码:
HDC hDc, memDc;
HWND m_hWnd = ::GetDesktopWindow();
hDc =::GetDC(m_hWnd);
memDc = CreateCompatibleDC(hDc);
int m_screenWidth   = GetSystemMetrics(SM_CXSCREEN);   //屏幕宽度
int m_screenHeight  = GetSystemMetrics(SM_CYSCREEN);   //屏幕高度
HBITMAP hBitMap;
        hBitMap = CreateCompatibleBitmap(hDc,m_screenWidth,m_screenHeight);
SelectObject(memDc,hBitMap);
        BitBlt(memDc,0,0,m_screenWidth,m_screenHeight,hDc,0,0,SRCCOPY);
CImage m_Screen;
m_Screen.Attach(hBitMap);
m_Screen.Save(L"D:\\s.jpg");
------解决思路----------------------
CImage   mmage;   
HWND   hWnd   =   ::GetDesktopWindow();//获得屏幕的HWND.   
HDC   hScreenDC   =   ::GetDC(hWnd);       //获得屏幕的HDC.   
HDC   MemDC   =   ::CreateCompatibleDC(hScreenDC);   
RECT   rect;     
::GetWindowRect(hWnd,&rect);   


HBITMAP   hBitmap   =   ::CreateCompatibleBitmap(hScreenDC,rect.right,rect.bottom);   
HGDIOBJ   hOldBMP   =   ::SelectObject(MemDC,hBitmap);   
::BitBlt(MemDC,0,0,rect.right,rect.bottom,hScreenDC,rect.left,rect.top,SRCCOPY);   
hBitmap=(HBITMAP)::SelectObject(MemDC,hOldBMP);   


mmage.Attach(hBitmap);   
IStream*   pStmImage   =   NULL;   


HGLOBAL   hMemBmp   =   GlobalAlloc(GMEM_MOVEABLE,0);//可移动的缓冲区   
if   (hMemBmp   ==   NULL)   return ;   
CreateStreamOnHGlobal(hMemBmp,   FALSE,   &pStmImage);//将内存区B作为流的起始   
if   (pStmImage   ==   NULL)   
{   
GlobalFree(hMemBmp);   
AfxMessageBox("为空");   
return   ;   
}   

     //屏幕BMP保存成JPEG IStream流
mmage.Save(pStmImage,Gdiplus::ImageFormatJPEG); //保存成JPEG IStream流
CDC *pDC =this->GetActiveView()->GetDC();//可换成你的DC,这里代码是放在主框架CMainFrame中的,所以才这样写
HDC hDC =pDC ->GetSafeHdc(); // 获取 HDC(设备句柄) 来进行绘图操作
CRect rc;
GetClientRect(&rc);
//mmage.Draw(hDC,rc);///屏幕截图在单文档的界面中显示,这里可以用来验证
//mmage.Save("jjj.jpg");///将图片保存出去,这里可以用来验证


这是我的,用的是GDI+。可以保存成JPEG.或者BMP
------解决思路----------------------
BitBlt(memDc,0,0,m_screenWidth,m_screenHeight,hDc,0,0,SRCCOPY);

最后一个参数填写SRCCOPY是不能截取到透明窗口的,需要使用组合参数:
SRCCOPY 
------解决思路----------------------
 CAPTUREBLT // CAPTUREBLT - 该参数保证能够截到透明窗口