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

📄 getcapdata.cpp

📁 软件源代码,共享。有2个文件
💻 CPP
字号:
#include ".\getcapdata.h"
#include "..\VipShellInfo\Lzw.h"

#include <tchar.h>
#pragma comment (lib, "Vfw32.lib")
struct tag_CapData
{
	BYTE* pCapBuff;
	DWORD dwLen;
};

tag_CapData g_CapData;
HWND g_hwndVideo = NULL;
CMyCriticalSection g_BuffLock;
bool g_IsLock  = false;
struct strCreateWndTag
{
	TCHAR szText[256];
	RECT rc;
};
CGetCapData::CGetCapData(void)
{
	g_CapData.pCapBuff = NULL;
	g_CapData.dwLen = 0;
	m_hwndVideo = NULL;
	b_IsOpen = false;
	m_hwndMain = NULL;
	g_IsLock = false;
	m_pDataLzw = NULL;
	m_dwLzwBuflen = 0;
	m_pHash = new WORD [LZW_MAX_HASH_SIZE] ;
}

CGetCapData::~CGetCapData(void)
{
	if(g_CapData.pCapBuff)
		delete g_CapData.pCapBuff;
	g_CapData.pCapBuff = NULL;
	g_CapData.dwLen = 0;
	Stop();
	if(m_pDataLzw)
		delete m_pDataLzw;
	delete m_pHash;
}

bool CGetCapData::IsOpen()
{
	return b_IsOpen;
}
void CGetCapData::__NewLzwBuff(DWORD dwLen)
{
	if(m_dwLzwBuflen < dwLen)
	{	
		if(m_pDataLzw)
			delete m_pDataLzw;
		m_pDataLzw = new BYTE[dwLen];
		if (m_pDataLzw)
			m_dwLzwBuflen = dwLen;
		else
			m_dwLzwBuflen = 0;
	}
}
bool CGetCapData::GetCapDataBuff(BYTE** pBuff, DWORD* dwLen, BYTE** pBufflzw , DWORD* dwlzw)
{

	if(pBuff)
		*pBuff = g_CapData.pCapBuff;
	if(dwLen)
		*dwLen = g_CapData.dwLen;
	if( g_CapData.dwLen == 0)
		return false;
	if(pBufflzw)
	{
		__NewLzwBuff(g_CapData.dwLen);
		//压缩
		FCLzw lzw;
		memset(m_pDataLzw, 0, g_CapData.dwLen);
		DWORD dwRLzwLen =  lzw.LZW_Encode(g_CapData.pCapBuff, g_CapData.dwLen, m_pDataLzw, m_pHash);
		*pBufflzw = m_pDataLzw;
		if(dwlzw)
			*dwlzw = dwRLzwLen;
	}
	return true;
}

bool CGetCapData::Stop()
{

	capPreview(g_hwndVideo, FALSE);
	capDriverDisconnect(g_hwndVideo);
	capCaptureStop(g_hwndVideo);
	capCaptureSingleFrameClose(g_hwndVideo);
	SendMessage(g_hwndVideo, WM_CLOSE, NULL, NULL);

	SendMessage(m_hwndMain, WM_CLOSE, NULL, NULL);
	SendMessage(m_hwndMain, WM_DESTROY, NULL, NULL);
	b_IsOpen = false;
	g_hwndVideo = NULL;
	m_hwndMain = NULL;
	return true;
}

void CGetCapData::Start(LPCTSTR szText, RECT* rc)
{
	if(b_IsOpen)
		return ;
	strCreateWndTag* pInfo = new strCreateWndTag;
	lstrcpy(pInfo->szText, szText);
	memcpy(&pInfo->rc, rc, sizeof(RECT));
	NewThread(pInfo);
}
BYTE* CGetCapData::__NewBuff(DWORD dwLen)
{
	if(dwLen > g_CapData.dwLen)
	{
		if(g_CapData.pCapBuff)
		{
			delete g_CapData.pCapBuff;
			g_CapData.pCapBuff = NULL;
		}
		g_CapData.pCapBuff = new BYTE[dwLen];
		if( g_CapData.pCapBuff )
			g_CapData.dwLen = dwLen;
		else
			g_CapData.dwLen = 0;
	}
	return g_CapData.pCapBuff;
}

void CGetCapData::OnNewThread(DWORD dwCreateMarker, DWORD dwThreadId, LPVOID lpParameter)
{

	strCreateWndTag* pInfo = (strCreateWndTag*)lpParameter;

	WCHAR szClassName[] = L"___GetCapWnd___";
	WNDCLASS wc={0};
	wc.style         = CS_HREDRAW | CS_VREDRAW ;
	wc.lpfnWndProc = CGetCapData::WindowProc;
	wc.cbClsExtra    = 0 ;
	wc.cbWndExtra    = 0 ;
	wc.hInstance = GetModuleHandle(NULL);
	wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
	wc.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
	wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
	wc.lpszMenuName  = NULL ;
	wc.lpszClassName = szClassName;

	RegisterClass(&wc);
	m_hwndMain = CreateWindowEx(0, szClassName, pInfo->szText, NULL, pInfo->rc.left, pInfo->rc.top, pInfo->rc.right, pInfo->rc.bottom, NULL, NULL, NULL, NULL);

	delete pInfo;
	if(IsWindow(m_hwndVideo))
		return ;
	CAPDRIVERCAPS CapDrvCaps;
	TCHAR szVfwName[256];
	TCHAR szVfwVersion[256];
	ZeroMemory(szVfwName, sizeof(szVfwName));
	ZeroMemory(szVfwVersion, sizeof(szVfwVersion));
	capGetDriverDescription(0, szVfwName, sizeof(szVfwName), szVfwVersion, sizeof(szVfwVersion));
	if(lstrlen(szVfwName) == 0)
		return ;
	m_hwndVideo = capCreateCaptureWindow(
		_T("My Capture Window"),
		WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
		0, 0, 300, 280,
		(HWND) m_hwndMain,
		(int) 1);
	if(m_hwndVideo == NULL)
		return ;

	BOOL bIsOk = capDriverConnect(m_hwndVideo,0);
	if(!bIsOk)
		return ;

	bIsOk =  capDriverGetCaps(m_hwndVideo, &CapDrvCaps,  sizeof(CAPDRIVERCAPS));
	if(!bIsOk)
		return ;
	if (CapDrvCaps.fHasOverlay) 
		capOverlay(m_hwndVideo, TRUE);
	capSetCallbackOnFrame(m_hwndVideo, CGetCapData::FrameCallBack);
	b_IsOpen =true;
	g_hwndVideo = m_hwndVideo;

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) 
	{

		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}


}

LRESULT PASCAL CGetCapData::WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_CREATE:
		SetTimer(hwnd, 0x100, 500, NULL);
		break;
	case WM_TIMER:
		capCaptureSingleFrame(g_hwndVideo);
		capCaptureSingleFrameOpen(g_hwndVideo);
		break;
	case WM_PAINT:
		break;
	case WM_DESTROY:
		KillTimer(hwnd, 0x100);
		capPreview(g_hwndVideo, FALSE);
		capDriverDisconnect(g_hwndVideo);
		capCaptureStop(g_hwndVideo);
		capCaptureSingleFrameClose(g_hwndVideo);
		SendMessage(g_hwndVideo, WM_CLOSE, NULL, NULL);
		return 0 ;
	}
	return DefWindowProc (hwnd, uMsg, wParam, lParam) ;
}

⌨️ 快捷键说明

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