如何实现实时远程屏幕监视
希望在局域网内实现一台机器对另一台机器屏幕的监视。
尝试了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




