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

📄 capturedlg.cpp

📁 昊天vod点播810版核心程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// CaptureDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Capture.h"
#include "CaptureDlg.h"
#include "Windows.h"

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h>

#include <direct.h> //文件操作
#include <io.h>

#include "Transform.h"
#include "HtAudio.h"

#define _WIN32_WINNT 0x0501

#pragma comment(lib, "HtAudio.lib" )//指定与静态库一起连接

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

#pragma data_seg(".MYSEC") 
char szFilename[20]={0}; 
char path_search[_MAX_PATH]; //表示文件(或目录)的信息 
#pragma data_seg()

DEFINE_GUID(CLSID_HtAudio,
//0xe5e6ea9f, 0x4645, 0x40c2, 0x82, 0x5c, 0x33, 0x1c, 0x4f, 0x4f, 0xae, 0x2b);
0x6af0f01e, 0xe640, 0x4bf0, 0xb2, 0x65, 0xde, 0x18, 0x7a, 0x3c, 0x28, 0x8d);


/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//把所有的接口指针和一些成员变量保存在一个全局结构gcap中
struct _capstuff 
{
    //消息
	int  iAudioDevice;
	
	//WMA解码器
	IBaseFilter *iWMAFilterOI;				//声道Filter指针
	IBaseFilter *iWMAFilterID;				//声道Filter地址
	IPin *iWMAFilterInput;					//WMAFilter入口
	IPin *iWMAFilterOutput;					//WMAFilter出口

	//声卡
	IPin *iAudioFile;
	IPin *iAudioFilterInput;				//声卡Filter入口
	IBaseFilter *iAudioFilterGraph;			//音频筛选器图表
	IBaseFilter *iAudioFilterOI;			//声卡Filter指针
	IBaseFilter *iAudioFilterID;			//声卡Filter地址

	//声道HtAudio Filter
	IBaseFilter *iHtAudioRightFilterclsid;	//声道Filter clsid
	IBaseFilter *iHtAudioFilterOI;			//声道Filter指针
	IBaseFilter *iHtAudioFilterID;			//声道Filter地址
	IBaseFilter *iHtAudioRightFilterOI;		//声道Filter指针
	IBaseFilter *iHtAudioRightFilterID;		//声道Filter地址
	IPin *iHtAudioFilterInput;				//声道Filter入口
	IPin *iHtAudioFilterOutput;				//声道Filter出口
	int AusioLeftRight;						//声道选择控制

	int FileTypeMunber;						//文件类型选择控制0=wmv 1=rmvb
	int DiskFreeCk;							//d:=2 e:=3

	//播放
	CString strFileName;					//正在播放文件名包含路径
	CString waitFileName;					//等待播放文件名包含路径
	//CString repeatFileName;				//重复播放文件名包含路径
	CString InString;
	
	//播放消息
	long eventCode;
	long eventParam1;
	long eventParam2;

	//读写剪贴板控制
	long PlayerCode;						//读写剪贴板字符
	long mUnGlobal;							//加减锁读写剪贴板控制

} gcap;

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCaptureDlg dialog

CCaptureDlg::CCaptureDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCaptureDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCaptureDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCaptureDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCaptureDlg)
	//DDX_Control(pDX, IDC_LIST1, m_SourceFileList);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCaptureDlg, CDialog)
	//{{AFX_MSG_MAP(CCaptureDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON2, OnHtAudioR)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCaptureDlg message handlers

BOOL CCaptureDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// 各指针参数的初始化
	m_VideoWindow	= NULL;
	m_BasicVideo	= NULL;
	m_MediaControl	= NULL;
	m_BasicAudio	= NULL;
	m_MediaEventEx	= NULL;
	m_FilterGraph	= NULL;
	m_pCapture		= NULL;
	m_MediaSeeking	= NULL;

	//mObjectTableEntry = 0;
    
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CCaptureDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

void CCaptureDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
	if (gcap.PlayerCode == 0)
	{
		WinExec("C:\\vbplayer\\FormBlock.exe",SW_SHOW);//调用播放底图
		gcap.PlayerCode = 1;
		SetTimer(0, 600, NULL);//计时器用于启动自动播放
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCaptureDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//写剪贴板
void CCaptureDlg::WlpGlobal() 
{
	if (gcap.mUnGlobal == 0)
	{
		gcap.mUnGlobal = 1;//加锁读写剪贴板
		CString rstr;
		switch(gcap.PlayerCode)
		 {
			 case 1:
				 rstr = gcap.InString + "OKO";//文件使用表示
				 break;

			 case 2:
				 rstr = "PRETURN0000000000000OKO";//请求新文件
				 break; 
			 case 3:
				 rstr = "00000000000000000000QUIT";//退出关闭黑底图
				 break;
		 }
		if (rstr != "")
		{
			try //执行命令行
			{
				DWORD dwLength = strlen(rstr); // 要复制的字串长度
				HANDLE hGlobalMemory = GlobalAlloc(GHND, dwLength + 1); // 分配内存
				LPBYTE lpGlobalMemory = (LPBYTE)GlobalLock(hGlobalMemory); // 锁定内存
				CopyMemory(lpGlobalMemory, rstr, dwLength);//拷贝数据到内存块
				GlobalUnlock(hGlobalMemory); // 锁定内存块解锁
				HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄
				::OpenClipboard(hWnd); // 打开剪贴板
				::EmptyClipboard(); // 清空剪贴板
				::SetClipboardData(CF_TEXT, hGlobalMemory); // 将内存中的数据放置到剪贴板
				::CloseClipboard(); // 关闭剪贴板
			}
			catch(...) //异常处理
			{ 
				HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄
				::OpenClipboard(hWnd); // 打开剪贴板
				HANDLE hClipMemory = ::GetClipboardData(CF_TEXT);// 获取剪贴板数据句柄
				GlobalUnlock(hClipMemory); // 内存解锁
				::CloseClipboard(); // 关闭剪贴板
			}
		}
	}
	gcap.mUnGlobal = 0;
	gcap.PlayerCode = 0;
	gcap.InString = "";
	return;
}

//获取剪贴板数据------------------------------------------------------------------------
void CCaptureDlg::RlpGlobal() 
{
	if (gcap.mUnGlobal == 0)
	{
		gcap.mUnGlobal = 1;//加锁读写剪贴板
		gcap.InString = "";
		try //执行命令行
		{
			HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄
			::OpenClipboard(hWnd); // 打开剪贴板
			HANDLE hClipMemory = ::GetClipboardData(CF_TEXT);// 获取剪贴板数据句柄
			DWORD dwLength = GlobalSize(hClipMemory); // 返回指定内存区域的当前大小
			LPBYTE lpClipMemory = (LPBYTE)GlobalLock(hClipMemory); // 锁定内存
			gcap.InString = CString(lpClipMemory); // 保存数据
			GlobalUnlock(hClipMemory); // 内存解锁
			::CloseClipboard(); // 关闭剪贴板
		}
		catch(...) //异常处理
		{ 
			HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄
			::OpenClipboard(hWnd); // 打开剪贴板
			HANDLE hClipMemory = ::GetClipboardData(CF_TEXT);// 获取剪贴板数据句柄
			GlobalUnlock(hClipMemory); // 内存解锁
			::CloseClipboard(); // 关闭剪贴板
		}
	}
	gcap.mUnGlobal = 0;//解锁读写剪贴板
	return;
}

//外部播放控制-------------------------------------------------------------------------
void CCaptureDlg::OnHtAudioR()
{
	HRESULT hr = NULL;
	if (gcap.mUnGlobal == 0)
	{
		gcap.mUnGlobal = 1;
		try //执行命令行
		{
			if (gcap.InString != "")//读取的剪贴板数据
			{
				CString FileData;
				CString last;
				CString Fast;

				FileData = gcap.InString;
				if (strlen(FileData) == 20) //取字节长度
				{
					last = FileData.Right(3);//右取文件最后三字节Mid(17,3)
					Fast = FileData.Left(17);//左取文件1-17字节
					//优先\准备待播放下一首歌曲播放
					if (last == "wkk" || last == "WMV") gcap.waitFileName = Fast + "wmv";
					if (last == "akk" || last == "AVI") gcap.waitFileName = Fast + "avi";
					if (last == "dkk" || last == "DAT") gcap.waitFileName = Fast + "dat";
					if (last == "mkk" || last == "MP3") gcap.waitFileName = Fast + "mp3";
					if (last == "mpk" || last == "MPG") gcap.waitFileName = Fast + "mpg";
					if (last == "vkk" || last == "VOB") gcap.waitFileName = Fast + "vob";
					if (last == "rkk" || last == "RMV") gcap.waitFileName = Fast + "rmvb";

					if (last == "wmv") gcap.waitFileName = FileData;//准备待播放下一首歌曲
					if (last == "avi") gcap.waitFileName = FileData;
					if (last == "dat") gcap.waitFileName = FileData;
					if (last == "mp3") gcap.waitFileName = FileData;
					if (last == "mpg") gcap.waitFileName = FileData;
					if (last == "vob") gcap.waitFileName = FileData;
					if (last == "rmv") gcap.waitFileName = FileData + "b";

					AutoPlayerFilts();//查找播放文件是否存在
					if (gcap.FileTypeMunber == 0) //未找到
					{
						gcap.waitFileName = "";
						gcap.PlayerCode = 2;//通知VB重新准备播放文件
					}
					else
					{
						gcap.PlayerCode = 1;
					}

					if (last == "dio") 
					{
						Set_AudioMode(1);//选择右声道
						gcap.PlayerCode = 1;
					}

					if (last == "di1") 
					{
						Set_AudioMode(0);//选择左声道
						gcap.PlayerCode = 1;
					}

					if (last == "uit") 
					{
						OnCancel();//退出系统
						gcap.PlayerCode = 3;
					}

					if (last == "use") 
					{
						m_MediaControl->Stop();//暂停
						gcap.PlayerCode = 1;
					}

					if (last == "lay") //继续播放
					{
						for(int i = 0 ; i < 500002 ; i++) //缓冲
						{
							if(i > 500000) 
							{
								m_MediaControl->Run();
								gcap.PlayerCode = 1;
							}
						}
					}

					if (last == "eat") //重复播放
					{
						for(int i = 0 ; i < 500002 ; i++) //缓冲
						{
							m_MediaControl->Stop();		//停止播放
							if(i > 500000)
							{
								AllRelease();				//释放全部应用
								gcap.PlayerCode = 1;
							}
						}
					}

					if (last == "top") //停唱播放下一首
					{
						for(int i = 0 ; i < 500002 ; i++) //缓冲
						{
							m_MediaControl->Stop();		//停止播放
							if(i > 500000)
							{
								gcap.strFileName = "";
								AllRelease();				//释放全部应用
								gcap.PlayerCode = 1;
							}
						}
					}
				}
				else
				{
					if (FileData == "0000000000000000StopOKO") 
					{
						gcap.PlayerCode = 2;
					}
					else
					{
						gcap.PlayerCode = 0;
					}
				}
			}
		}
		catch(...) //异常处理
		{ 
			for(int i = 0 ; i < 500002 ; i++)	//缓冲

⌨️ 快捷键说明

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