终于有点突破了,研究了一在的远程监控,用GDI+屏幕截图内存BMP转JPG,JPG再转IStream流,IStream流再转BYTE;
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");///将图片保存出去,这里可以用来验证
IStream流转成BYTE
//得到缓冲区的起始地址
BYTE* pbyBmp=(BYTE*)GlobalLock(hMemBmp);
//锁住内存
GlobalUnlock(hMemBmp);
//得到格式转换后图片的大小
m_BufferSize=GlobalSize(hMemBmp);
//把内存中的JPG格式图片数据拷贝到频道1发送缓冲区中
memcpy((void*)m_Buffer,(void*)pbyBmp,m_BufferSize);
其中。。 BYTE m_Buffer[65536]; //定义在头文件CMainFrame中
SIZE_T m_BufferSize;//定义在头文件中
至此,就把屏幕内存BMP转BYTE了。这里可以用来远程监控或远程控制传输桌面了!!!
下面的文章接着讲怎么将BYTE转成Stream流并显示出来