⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfwwrapper.cpp

📁 Screen Chatting source
💻 CPP
字号:
// VFWWrapper.cpp: implementation of the CVFWWrapper class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ScreenChattingServer.h"
#include "VFWWrapper.h"

//#include "WinBmpEx.h"

//#include <mmsystem.h>
#include <mmreg.h>

#define DEF_CAPTURE_FPS          15
#define MIN_CAPTURE_FPS          (1.0 / 60)     // one frame per minute
#define MAX_CAPTURE_FPS          100

#define FPS_TO_MS(f)             ((DWORD) ((double)1.0e6 / f))

#define DEF_CAPTURE_RATE         FPS_TO_MS(DEF_CAPTURE_FPS)
#define MIN_CAPTURE_RATE         FPS_TO_MS(MIN_CAPTURE_FPS)
#define MAX_CAPTURE_RATE         FPS_TO_MS(MAX_CAPTURE_FPS)

#define CAP_SMALL_INDEX          (30 * 60 * 15)         // 15 minutes @ 30fps

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CVFWWrapper,CObject,1)

CVFWWrapper::CVFWWrapper()
{
	m_pCapWnd=NULL;
	m_pParentWnd=NULL;

	m_uDriverCount=0;
	m_bHaveHardware=FALSE;
	m_uDeviceIndex=0;

	EnumDrivers();
}

CVFWWrapper::~CVFWWrapper()
{
	m_pCapWnd->Detach();
	delete m_pCapWnd;

	m_pCapWnd=NULL;
	m_pParentWnd=NULL;

	m_uDriverCount=0;
	m_bHaveHardware=FALSE;
	m_uDeviceIndex=0;
}

CVFWWrapper::CVFWWrapper(BOOL bCreateCaptureWindow,CRect rect,CWnd *pParentWnd,UINT uIndex)
{
	m_pCapWnd=NULL;
	m_pParentWnd=NULL;

	m_uDriverCount=0;
	m_bHaveHardware=FALSE;
	m_uDeviceIndex=0;

	EnumDrivers();
	if (!Initialize(bCreateCaptureWindow,TRUE,rect,pParentWnd,uIndex)) ::MessageBox(pParentWnd->m_hWnd,"檬扁拳俊 角菩沁嚼聪促.","VFWWrapper",MB_OK);
}

BOOL CVFWWrapper::Initialize(BOOL bCreateCaptureWindow,BOOL bPreview,CRect rect,CWnd *pParentWnd,UINT uIndex)
{
	if (!pParentWnd) return FALSE;

	m_pParentWnd=pParentWnd;

	try
    {		
		if (bCreateCaptureWindow)
		{
			HWND hCapWnd=capCreateCaptureWindow("VFWWrapper",WS_CHILD|WS_VISIBLE,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,pParentWnd->m_hWnd,1);
			if (!hCapWnd) return FALSE;

			m_pCapWnd=new CWnd;
			m_pCapWnd->Attach(hCapWnd);

			if (!capCaptureGetSetup(m_pCapWnd->m_hWnd,&m_capParms,sizeof(CAPTUREPARMS))) return FALSE;
		}
		else 
		{
			if (!capCaptureGetSetup(m_pParentWnd->m_hWnd,&m_capParms,sizeof(CAPTUREPARMS))) return FALSE;

			m_pCapWnd=NULL;
		}

		if (!InitHardware(uIndex)) return FALSE;
		if (bPreview) 
		{
			if (bCreateCaptureWindow) 
			{
				if (!capPreview(m_pCapWnd->m_hWnd,TRUE)) return FALSE;
				if (!capCaptureSequenceNoFile(m_pCapWnd->m_hWnd)) return FALSE;
			}
			else 
			{
				if (!capPreview(m_pParentWnd->m_hWnd,TRUE)) return FALSE;
				if (!capCaptureSequenceNoFile(m_pCapWnd->m_hWnd)) return FALSE;
			}
		}
	}	
    catch(CException e)
    {
        ::MessageBox(pParentWnd->m_hWnd,"檬扁拳俊 角菩沁嚼聪促.","VFWWrapper",MB_OK);
        
		return FALSE;
    }

	return TRUE;
}

void CVFWWrapper::Serialize(CArchive& archive)
{
	if (archive.IsLoading())
	{

	}
	else
	{

	}
}

BOOL CVFWWrapper::InitHardware(UINT uIndex)
{
    UINT uError;

    char szName[MAX_PATH];
    char szVersion[MAX_PATH];

	CWnd *pCapConcernedWnd;

	if (!m_pCapWnd) pCapConcernedWnd=m_pParentWnd;
	else pCapConcernedWnd=m_pCapWnd;

    if (uError=capDriverConnect(pCapConcernedWnd->m_hWnd, uIndex)) 
	{
        m_bHaveHardware=TRUE;
        m_uDeviceIndex=uIndex;
    }
    else 
	{
        m_bHaveHardware=FALSE;
    }

    if (!capDriverGetCaps(pCapConcernedWnd->m_hWnd,&m_capDriverCaps,sizeof(CAPDRIVERCAPS))) return FALSE;
    if (!capGetStatus(pCapConcernedWnd->m_hWnd,&m_capStatus,sizeof(m_capStatus))) return FALSE;
    if (!capGetDriverDescription(uIndex,szName,sizeof(szName),szVersion,sizeof (szVersion))) return FALSE;
    if (!capPreviewRate(pCapConcernedWnd->m_hWnd,m_bHaveHardware?33:0)) return FALSE;
//	if (!capOverlay(pCapConcernedWnd->m_hWnd,0)) return FALSE;
/*
	CAPTUREPARMS capParams;

	capParams.dwRequestMicroSecPerFrame=100000;
//	capParams.fMakeUserHitOKToCapture=
//	capParams.wPercentDropForError=
	capParams.fYield=TRUE;
//	capParams.dwIndexSize=
//	capParams.wChunkGranularity=
//	capParams.fUsingDOSMemory=
//	capParams.wNumVideoRequested=
	capParams.fCaptureAudio=FALSE;
//	capParams.wNumAudioRequested=
	capParams.vKeyAbort=VK_ESCAPE;
	capParams.fAbortLeftMouse=FALSE;
	capParams.fAbortRightMouse=FALSE;
	capParams.fLimitEnabled=FALSE;
//	capParams.wTimeLimit=
	capParams.fMCIControl=FALSE;
//	capParams.fStepMCIDevice=
//	capParams.dwMCIStartTime=
//	capParams.dwMCIStopTime=
//	capParams.fStepCaptureAt2x=
//	capParams.wStepCaptureAverageFrames=
//	capParams.dwAudioBufferSize=
//	capParams.fDisableWriteCache=
//	capParams.AVStreamMaster=

	if (!capCaptureSetSetup(pCapConcernedWnd->m_hWnd,&capParams,sizeof(capParams))) return FALSE;
*/
    strcat(szName,",   ");
    strcat(szName,szVersion);

    return m_bHaveHardware;
}

BOOL CVFWWrapper::EnumDrivers()
{
	char achDeviceVersion[80];
	char achDeviceAndVersion[160];
	
    UINT uIndex;

    for (uIndex=0;uIndex<MAXVIDDRIVERS;uIndex++) 
	{
        if (capGetDriverDescription(uIndex,(LPSTR)achDeviceAndVersion,sizeof(achDeviceAndVersion),(LPSTR)achDeviceVersion,sizeof(achDeviceVersion))) 
		{
            lstrcat(achDeviceAndVersion,",   ");
            lstrcat(achDeviceAndVersion,achDeviceVersion);

			m_strDeviceAndVersion[m_uDriverCount]=achDeviceAndVersion;

			m_uDriverCount++;
        }
        else break;
    }

    return TRUE;
}

BOOL CVFWWrapper::CaptureFrame()
{
	if (!m_pCapWnd) return FALSE;
	if (!capPreview(m_pCapWnd->m_hWnd,FALSE)) return FALSE;

	if (!capGrabFrameNoStop(m_pCapWnd->m_hWnd)) return FALSE;
	
	return TRUE;
}

BOOL CVFWWrapper::SetHandler(FARPROC fpErrorCallback, FARPROC fpYieldCallback, FARPROC fpStatusCallback,FARPROC fpVideoStreamCallback,FARPROC fpFrameCallback)
{
	CWnd *pCapConcernedWnd;

	if (!m_pCapWnd) pCapConcernedWnd=m_pParentWnd;
	else pCapConcernedWnd=m_pCapWnd;

	if (!capSetCallbackOnError(pCapConcernedWnd->m_hWnd,fpErrorCallback)) return FALSE;
	if (!capSetCallbackOnYield(pCapConcernedWnd->m_hWnd,fpYieldCallback)) return FALSE;
	if (!capSetCallbackOnStatus(pCapConcernedWnd->m_hWnd,fpStatusCallback)) return FALSE;
	if (!capSetCallbackOnVideoStream(pCapConcernedWnd->m_hWnd,fpVideoStreamCallback)) return FALSE;
	if (!capSetCallbackOnFrame(pCapConcernedWnd->m_hWnd,fpFrameCallback)) return FALSE;
		
	return TRUE;
}

BITMAPINFO * CVFWWrapper::GetBitmapInfo()
{
	CWnd *pCapConcernedWnd;

	if (!m_pCapWnd) pCapConcernedWnd=m_pParentWnd;
	else pCapConcernedWnd=m_pCapWnd;

	BITMAPINFO *pBi=new BITMAPINFO;

	capGetVideoFormat(pCapConcernedWnd->m_hWnd,pBi,sizeof(BITMAPINFO));

	return pBi;
}

BOOL CVFWWrapper::ChangeFormat()
{
	if (m_capDriverCaps.fHasDlgVideoFormat) 
	{	
//		oldhelpid = SetCurrentHelpContext(IDA_VIDFORMAT);
		if (capDlgVideoFormat(m_pCapWnd->m_hWnd)) 
		{
			if (!capGetStatus(m_pCapWnd->m_hWnd,&m_capStatus,sizeof(CAPSTATUS))) return FALSE;
//			vidcapLayout(hWnd);
		}
	}
	else return FALSE;

	return TRUE;
}

BOOL CVFWWrapper::ChangeSource()
{
	if (m_capDriverCaps.fHasDlgVideoSource) 
	{	
//		oldhelpid = SetCurrentHelpContext(IDA_VIDFORMAT);
		if (capDlgVideoSource(m_pCapWnd->m_hWnd)) 
		{
			if (!capGetStatus(m_pCapWnd->m_hWnd,&m_capStatus,sizeof(CAPSTATUS))) return FALSE;
//			vidcapLayout(hWnd);
		}
	}
	else return FALSE;

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -