📄 capturedlg.cpp
字号:
// 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 + -