CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

如何实现实时远程屏幕监视

楼主zy3481(远影孤帆)2005-04-01 14:40:42 在 VC/MFC / 图形处理/算法 提问

希望在局域网内实现一台机器对另一台机器屏幕的监视。  
  尝试了Bitblt抓屏,然后传bitmap.GetBitmapBits得到的buf,但发现传递的buf太大,导致刷新频率太低(分辨率1024*768或1280*1024)  
  听说用vnc(virtual   network   computer)实现效果比较好,下载了一个基于ultravnc的软件,但源码太多,看不懂:(  
  有没有高手给发一段简易的代码?只要能实现屏幕监视就行。 问题点数:50、回复次数:11Top

1 楼billy145533($_$)回复于 2005-04-01 17:00:12 得分 5

顶,我也做过,和你一样Top

2 楼xuzheng318(忧郁王子)回复于 2005-04-01 17:00:54 得分 15

看看vnc源码!Top

3 楼puma5()回复于 2005-04-01 18:29:03 得分 5

如果只是监视的话可以用windows   mediaEncoder   sdk来做  
  #pragma   once  
  #include   <atlbase.h>  
  #include   "C:\WMSDK\WMEncSDk9\include\wmencode.h"  
  #include   "C:\WMSDK\WMEncSDK9\include\wmencvu.h"  
  /*  
  名称:NetCam  
  功能:实现对Windows   MediaEncoder的简单封装,音视频的采集及网上传输  
  作者:李宇昕  
  编制开始时间:3/2-2005             完成时间:4/2-2005  
  测试:李宇昕  
  测试开始时间:  
  */  
  class   NetCam  
  {  
  public:  
  NetCam(void);  
  virtual   ~NetCam(void);  
   
  protected:  
   
  IWMEncoder* m_pEncoder;  
  IWMEncoder2* m_pEncoder2;  
  IWMEncDataView* m_pView;  
  IWMEncDataViewCollection* m_pViewColl;  
  IWMEncSourceGroupCollection* m_pSrcGrpColl;  
  IWMEncSourceGroup* m_pSrcGrp;  
  IWMEncSource* m_pVidSrc;  
  IWMEncSource* m_pAudSrc;  
  IWMEncProfileCollection* m_pProColl;  
  IWMEncProfile* m_pPro;  
  IWMEncBroadcast* m_pBrdCst;  
  IWMEncFile* m_pFile;  
  IWMEncFile2* m_pFile2;  
   
   
  CStringArray   m_VidDeviceName;  
  CStringArray   m_AudDeviceName;  
  short   m_iPort;  
  bool   m_bPreView; //是否进行预览  
  bool   m_bScreen; //是否进行屏幕捕捉  
  bool   m_bRecord; //是否记录到文件  
  long   lCookie;  
   
  HWND   m_hWnd;  
   
   
  public:  
  bool   InitWMedia(void);  
  //   枚举机器所装的音视频设备  
  void   EnumerateDevice(void);  
  //   清除WMedia对象  
  void   ClearWMedia(void);  
  //   设置媒体广播端口号  
  void   SetPort(short   port);  
  //   设置视频信号源  
  bool   SetVideoSource(int   iType);  
  //   设置Profile文件  
  bool   SetPro(void);  
  //   开始运行  
  bool   Start(void);  
  //   停止编码过程  
  bool   Stop(void);  
  //   暂停运行编码器  
  bool   Pause(void);  
  //   设置预览窗口句柄  
  bool   SetHwnd(HWND   prevHwnd);  
  //   设置需要记录的文件及文件大小  
  bool   SetFile(CString   strFileName,   int   nSize);  
  };  
  Top

4 楼puma5()回复于 2005-04-01 18:31:04 得分 0

#include   "StdAfx.h"  
  #include   "netcam.h"  
   
  NetCam::NetCam(void)  
  {  
  m_pEncoder   =   NULL;  
  m_pEncoder2   =   NULL;  
  m_pSrcGrpColl   =   NULL;  
  m_pSrcGrp   =   NULL;  
  m_pVidSrc   =   NULL;  
  m_pAudSrc   =   NULL;  
  m_pProColl   =   NULL;  
  m_pPro   =   NULL;  
          m_pViewColl   =   NULL;  
  m_pView   =   NULL;  
  m_pBrdCst   =   NULL;  
  m_bPreView   =   TRUE;  
  m_bScreen   =   false;  
  m_bRecord   =   false;  
  lCookie   =   -1;  
   
  }  
   
  NetCam::~NetCam(void)  
  {  
  ClearWMedia();  
  }  
   
  bool   NetCam::InitWMedia(void)  
  {  
  HRESULT   hr;  
   
  hr   =   CoCreateInstance(CLSID_WMEncoder,   NULL,   CLSCTX_INPROC_SERVER,  
  IID_IWMEncoder,   (void**)&m_pEncoder);  
   
  if(SUCCEEDED(hr))  
  hr   =     m_pEncoder->QueryInterface(IID_IWMEncoder2,   (void**)&m_pEncoder2);  
  else  
  return   false;  
   
   
   
  if(SUCCEEDED(hr))  
  hr   =   m_pEncoder->get_SourceGroupCollection(&m_pSrcGrpColl);  
  else  
  return   false;  
   
  if(SUCCEEDED(hr))  
  hr   =   m_pSrcGrpColl->Add(CComBSTR("SG_1"),   &m_pSrcGrp);  
  else  
  return   false;  
   
  if(SUCCEEDED(hr))  
  hr   =   m_pSrcGrp->AddSource(WMENC_VIDEO,   &m_pVidSrc);  
          else  
  return   false;  
   
   
  if(SUCCEEDED(hr))  
  hr   =   m_pSrcGrp->AddSource(WMENC_AUDIO,   &m_pAudSrc);  
  else  
  return   false;  
   
   
  if(SUCCEEDED(hr))  
  hr   =   m_pAudSrc->SetInput(CComBSTR("DEVICE://Default_Audio_Device"));  
  else  
  return   false;  
   
   
  if(SUCCEEDED(hr))  
  hr   =   m_pEncoder->get_ProfileCollection(&m_pProColl);  
  else  
  return   false;  
   
  if(SUCCEEDED(hr))  
  hr   =   m_pProColl->Item(4,   &m_pPro);  
  else  
  return   false;  
   
  if(SUCCEEDED(hr))  
  hr   =   m_pEncoder->get_Broadcast(&m_pBrdCst);  
  else  
  return   false;  
   
  if(SUCCEEDED(hr))  
  hr   =   m_pEncoder->get_File(&m_pFile);  
  else  
  return   false;  
   
  if(SUCCEEDED(hr))  
  hr   =   m_pFile->QueryInterface(IID_IWMEncFile2,   (void**)&m_pFile2);  
  else  
  return   false;  
   
  if(SUCCEEDED(hr))  
                  hr   =   CoCreateInstance(CLSID_WMEncPreview,   NULL,  
  CLSCTX_INPROC_SERVER,  
  IID_IWMEncDataView,  
  (void**)&m_pView);  
  else  
  return   false;  
   
  if(SUCCEEDED(hr))  
  hr   =   m_pVidSrc->get_PreviewCollection(&m_pViewColl);  
  else  
  return   false;  
   
   
  if(SUCCEEDED(hr))  
  hr   =   m_pViewColl->Add(m_pView,   &lCookie);  
  else  
  return   false;  
   
           
   
   
  return   true;  
  }  
   
  //   枚举机器所装的音视频设备  
  void   NetCam::EnumerateDevice(void)  
  {  
  IWMEncSourcePluginInfoManager* pSrcPlugMgr   =   NULL;  
  IWMEncPluginInfo* pPlugInfo   =   NULL;  
   
  HRESULT   hr;  
  int   i,   j;  
  long   lCount,   lResrcCount;  
  CComBSTR   sName,   sSchem;  
  VARIANT_BOOL   bResources;  
   
   
  hr   =   m_pEncoder2->get_SourcePluginInfoManager(&pSrcPlugMgr);  
   
  if(SUCCEEDED(hr))  
  hr   =   pSrcPlugMgr->get_Count(&lCount);  
   
  for(i   =   0;   i   <   lCount;   i++)  
  {  
  if(SUCCEEDED(hr))  
  hr   =   pSrcPlugMgr->Item(i,   &pPlugInfo);  
   
  if(SUCCEEDED(hr))  
  hr   =   pPlugInfo->get_SchemeType(&sSchem);  
   
  if(_wcsicmp(sSchem,   CComBSTR("DEVICE"))   ==   0)  
  {  
  if(SUCCEEDED(hr))  
  hr   =   pPlugInfo->get_Resources(&bResources);  
   
  if(bResources   ==   VARIANT_TRUE)  
  {  
  if(SUCCEEDED(hr))  
  hr   =   pPlugInfo->get_Count(&lResrcCount);  
   
  for(j   =   0;   j   <   lResrcCount;   j++)  
  {  
  if(SUCCEEDED(hr))  
  {  
  hr   =   pPlugInfo->Item(j,   &sName);  
   
  m_VidDeviceName.Add(CW2A(sName));  
   
  }  
   
  }  
  }  
  }  
  }  
   
   
   
  if(pSrcPlugMgr)  
  {  
  pSrcPlugMgr->Release();  
  pSrcPlugMgr   =   NULL;  
  }  
   
  if(pPlugInfo)  
  {  
  pPlugInfo->Release();  
  pPlugInfo   =   NULL;  
  }  
           
   
  }  
   
  //   清除WMedia对象  
  void   NetCam::ClearWMedia(void)  
  {  
   
  if(m_pFile2)  
  {  
  m_pFile2->Release();  
  m_pFile2   =   NULL;  
  }  
   
  if(m_pFile)  
  {  
  m_pFile->Release();  
  m_pFile   =   NULL;  
  }  
           
   
  if(m_pView)  
  {  
  m_pView->Release();  
  m_pView   =   NULL;  
  }  
   
  if(m_pViewColl)  
  {  
  m_pViewColl->Release();  
  m_pViewColl   =   NULL;  
  }  
           
   
  if(m_pVidSrc)  
  {  
  m_pVidSrc->Release();  
  m_pVidSrc   =   NULL;  
  }  
   
  if(m_pAudSrc)  
  {  
  m_pAudSrc->Release();  
  m_pAudSrc   =   NULL;  
  }  
   
  if(m_pSrcGrp)  
  {  
  m_pSrcGrp->Release();  
  m_pSrcGrp   =   NULL;  
  }  
   
  if(m_pSrcGrpColl)  
  {  
  m_pSrcGrpColl->Release();  
  m_pSrcGrpColl   =   NULL;  
  }  
           
   
  if(m_pPro)  
  {  
  m_pPro->Release();  
  m_pPro   =   NULL;  
  }  
   
  if(m_pProColl)  
  {  
  m_pProColl->Release();  
  m_pProColl   =   NULL;  
  }  
   
  if(m_pEncoder2)  
  {  
  m_pEncoder2->Release();  
  m_pEncoder2   =   NULL;  
  }  
   
  if(m_pEncoder)  
  {  
  m_pEncoder->Release();  
  m_pEncoder   =   NULL;  
  }  
   
   
  }  
   
  //   设置媒体广播端口号  
  void   NetCam::SetPort(short   port)  
  {  
  m_iPort   =     port;  
   
  m_pEncoder->Reset();  
   
  Start();  
  }  
   
  //   设置视频信号源  
  //   iType:   0-缺省视频采集设备(摄像头)   1-屏幕捕捉    
  bool   NetCam::SetVideoSource(int   iType)  
  {  
  HRESULT   hr;  
   
  switch(iType)  
  {  
                  case   0:  
                          hr   =   m_pVidSrc->SetInput(CComBSTR("DEVICE://Default_Video_Device"));  
  break;  
   
  case   1:  
  hr   =   m_pVidSrc->SetInput(CComBSTR("ScreenCap://ScreenCapture1"));  
  m_bScreen   =   true;  
  break;  
  }  
   
   
  if(SUCCEEDED(hr))  
  return   true;  
  else  
                  return   false;  
   
  }  
   
  //   设置Profile文件  
  bool   NetCam::SetPro(void)  
  {  
   
  int   i;  
  long   lNum;  
  HRESULT   hr;  
  CComBSTR   sName;  
  IWMEncProfileManager*   pProMgr   =   NULL;  
   
  hr   =   CoCreateInstance(CLSID_WMEncProfileManager,   NULL,  
  CLSCTX_INPROC_SERVER,  
  IID_IWMEncProfileManager,  
  (void**)&pProMgr);  
           
   
  if(SUCCEEDED(hr))  
                  hr   =   m_pProColl->get_Count(&lNum);  
   
  for(i   =   0;   i   <   lNum;   i++)  
  {  
  if(SUCCEEDED(hr))  
  hr   =   m_pProColl->Item(i,   &m_pPro);  
   
   
                  if(SUCCEEDED(hr))  
  hr   =   m_pPro->get_Name(&sName);  
   
  if(_wcsicmp(sName,   CComBSTR("screencam"))   ==   0)  
  {  
  if(SUCCEEDED(hr))  
  {  
  pProMgr->WMEncProfileEdit(sName,   WMENC_FILTER_AV,   0); //配置profile文件  
  m_pSrcGrp->put_Profile(CComVariant(m_pPro)); //设定profile文件  
  }  
   
  }  
   
  }  
   
  if(pProMgr)  
  {  
  pProMgr->Release();  
  pProMgr   =   NULL;  
  }  
   
  return   true;  
  }  
   
  //   开始运行  
  bool   NetCam::Start(void)  
  {  
  HRESULT   hr;  
   
  hr   =   m_pBrdCst->put_PortNumber(WMENC_PROTOCOL_HTTP,   m_iPort);  
   
  if(SUCCEEDED(hr))  
                  hr   =   m_pEncoder->PrepareToEncode(VARIANT_TRUE);  
   
   
  if(SUCCEEDED(hr))  
                  hr   =   m_pEncoder->Start();  
   
  if(!m_bScreen)  
  {  
                  if(SUCCEEDED(hr))  
  hr   =   m_pView->Start(lCookie);  
  }  
           
   
  if(SUCCEEDED(hr))  
                  return   true;  
  else  
  return   false;  
   
  }  
   
  //   停止编码过程  
  bool   NetCam::Stop(void)  
  {  
   
  HRESULT   hr;  
   
  if(!m_bScreen)  
  hr   =   m_pView->Stop(lCookie);  
   
   
   
  if(SUCCEEDED(hr))  
                  hr   =   m_pEncoder->Stop();  
   
  if(SUCCEEDED(hr))  
  return   true;  
  else  
                  return   false;  
  }  
   
  //   暂停运行编码器  
  bool   NetCam::Pause(void)  
  {  
  HRESULT   hr;  
   
  hr   =   m_pEncoder->Pause();  
   
  if(SUCCEEDED(hr))  
  return   true;  
  else  
                  return   false;  
   
  }  
   
  //   设置预览窗口句柄  
  bool   NetCam::SetHwnd(HWND   prevHwnd)  
  {  
   
  HRESULT   hr;  
   
  m_hWnd   =   prevHwnd;  
   
  hr   =   m_pView->SetViewSetting((DWORD)lCookie,   sizeof(HWND),   (BYTE*)&m_hWnd);  
   
  if(SUCCEEDED(hr))  
  return   true;  
  else  
                  return   false;  
   
  }  
   
  //   设置需要记录的文件及文件大小,nSize   =   n   MB  
  bool   NetCam::SetFile(CString   strFileName,   int   nSize)  
  {  
  HRESULT   hr;  
  WMENC_LONGLONG   size;  
   
  hr   =   m_pFile2->put_LocalFileName(CComBSTR(strFileName));  
   
  size.int64   =   1048576   *   nSize;  
   
  if(SUCCEEDED(hr))  
  hr   =   m_pFile2->put_FileSize(size);  
   
   
          if(SUCCEEDED(hr))  
  return   true;  
  else  
                  return   false;  
   
  }  
  Top

5 楼rocklabzhang()回复于 2005-04-02 12:22:31 得分 5

markTop

6 楼KelvinSpace(Kelvin)回复于 2005-04-02 16:48:18 得分 5

看看我的^^  
  下载  
  http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=919Top

7 楼jijuzheng(极品飞车)(我爱瓜瓜)回复于 2005-04-03 15:15:33 得分 5

找个木马的代码看看也可以Top

8 楼dTianx(铁锈)回复于 2005-04-03 15:54:05 得分 5

查看   WinVNC   的代码Top

9 楼nicfeng(石头)回复于 2005-04-04 13:02:32 得分 5

推荐一本书   《Winsock2网络编程使用教程》   清华大学出版社  
  第六章有一个完整的例子     和你的需求一模一样   光盘中有源码Top

10 楼zy3481(远影孤帆)回复于 2005-04-07 15:50:07 得分 0

看来看去,还是决定看vnc的源代码,实时性比较好。Top

11 楼henryjee(henryjee)回复于 2005-07-29 11:17:14 得分 0

gzTop

相关问题

  • 如何编写可连断快速监视远程屏幕的程序
  • 有关Volume的实时监视
  • 求远程监视桌面的代码!!!
  • 如何远程控制屏幕?
  • 怎样实时监视注册表,在线等,急!!!!
  • 实时监视用户是否修改电脑的IP地址?
  • 怎样制作远程监视软件(互联网)?????????????????
  • 请教关于远程实时监控系统的问题
  • 如何实时监控本机连接的远程IP?
  • 如何实现屏幕的监视和广播/组播

关键词

  • 监视
  • 屏幕
  • hr
  • release
  • null
  • ppluginfo
  • netcam
  • psrcplugmgr
  • pfile
  • 实现

得分解答快速导航

  • 帖主:zy3481
  • billy145533
  • xuzheng318
  • puma5
  • rocklabzhang
  • KelvinSpace
  • jijuzheng
  • dTianx
  • nicfeng

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo