BitBltPicture局域网截屏图片全黑

ChbaiMou 2015-06-29 05:24:58
用的是C语言的windows服务程序做的一个局域网截屏,并发送图片的程序,结果保存的图片一片黑。
部分截屏代码:

class Intercept
{
public:

//初始化 传入窗口句柄
Intercept(HWND hwnd1,LPCTSTR path):m_hSrcWnd(hwnd1),filepath(path)
{

}
//根据句柄获得窗口DC
HDC GetWindowsDC(HWND hwnd)
{
return ::GetDC(hwnd);
}

//获得源窗口的宽
void GetWindowsWidth()
{
::RECT rect;
GetWindowRect(m_hSrcWnd,&rect);
m_nCxWnd = rect.right - rect.left;

}

//获得源窗口的高
void GetWindowHeigh()
{
::RECT rect;
::GetWindowRect(m_hSrcWnd,&rect);
m_nCyWnd = rect.bottom - rect.top;
}

//将源窗口画到目标窗口
BOOL BitBltPicture()
{
CString m_str(filepath);m_str+=FileName;filepath = (LPCTSTR)m_str;
m_hScrDC = GetWindowsDC(GetDesktopWindow()/*m_hSrcWnd*/);
GetWindowsWidth();
GetWindowHeigh();
//c创建位图
if(!img.Create(m_nCxWnd,m_nCyWnd,32))
return -1;
m_hdcMem = ::CreateCompatibleDC(m_hScrDC);
m_hBitmap = ::CreateCompatibleBitmap(m_hScrDC,m_nCxWnd,m_nCyWnd);
::SelectObject(m_hdcMem,m_hBitmap);
::BitBlt(m_hdcMem,0,0,m_nCxWnd,m_nCyWnd,m_hScrDC,0,0,SRCCOPY);
::BitBlt(img.GetDC(),0,0,m_nCxWnd,m_nCyWnd,m_hdcMem,0,0,SRCCOPY);
img.Save(filepath,Gdiplus::ImageFormatJPEG);
img.ReleaseDC();

return 0;
}

~Intercept()
{
::DeleteDC(m_hdcMem);
::DeleteDC(m_hScrDC);
//::DeleteDC(m_hDestDC);
::DeleteObject(m_hBitmap);
::ReleaseDC(m_hSrcWnd,m_hScrDC);
}
private:
HWND m_hSrcWnd;
//HWND m_hDestWnd;
int m_nCxWnd;
int m_nCyWnd;
HDC m_hdcMem;
HDC m_hScrDC;
//HDC m_hDestDC;
HBITMAP m_hBitmap;
LPCTSTR filepath;
CImage img;
};

保存图片代码:每3秒保存一张图片

void CSampleService::ServiceWorkerThread(void)
{
CString mstr(MAPPATH);
DWORD jpgno = 0;
mstr += FileName;
Intercept * bitmap;
// Periodically check if the service is stopping.
WaitForSingleObject(m_StartThreadEvent,INFINITE);
while (1)
{
Sleep(3000);
if (m_fPausing)
{
Sleep(100);
continue;
}
bitmap = new Intercept(::GetDesktopWindow(),MAPPATH);
if((m_fStopping))
{
break;
}
// Perform main service function here...
if(bitmap->BitBltPicture() != 0){
WriteErrorLogEntry(L"SaveScreenJpg",144);
continue;
}
delete bitmap;
if (!sendmap((LPCTSTR)mstr,serverIp,serverPort))
{
WriteErrorLogEntry(L"SendJpgToServerFeil",4);
continue;
}

}
//::Sleep(2000); // Simulate some lengthy operations.
// Signal the stopped event.
SetEvent(m_hStoppedEvent);
}

打印结果:
...全文
278 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChbaiMou 2015-07-27
  • 打赏
  • 举报
回复
恩 原因是win7,Vista版本服务和桌面是隔离的,xp和win2003不隔离。我在后两个系统可以截图了,但是传的过程中有的图片会显示已损坏又是怎么回事呢?传的速度越快 损坏了文件越多。。。求指教。
阿源是少年 2015-07-25
  • 打赏
  • 举报
回复
嗯,你本地截图,不传,图片能显示吗,图片能显示就是传输出问题了,你先确定下
汪宁宇 2015-07-25
  • 打赏
  • 举报
回复
引用 2 楼 zzz3265 的回复:
程序是个服务吗? 服务程序的会话, 桌面跟普通程序是不一样的, 对桌面截图不了很正常的 用正常的方式启动看看能否截图
1、发送/接受失败 2、接受乱序掉包等问题
Yofoo 2015-07-07
  • 打赏
  • 举报
回复
程序是个服务吗? 服务程序的会话, 桌面跟普通程序是不一样的, 对桌面截图不了很正常的 用正常的方式启动看看能否截图
ChbaiMou 2015-06-30
  • 打赏
  • 举报
回复
没有人吗。。。。

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧