背景:我需要一个函数,启动windows系统中的程序 windows media player ,用于播放我所指定的音频文件;
问题:百度网上的大多数用法,都是在mfc中插入 windows media player的控件,进行相关操作,对于此种用法我不多做介绍。但是我的程序是无界面的,所以上述行为对于我来说并不适用,而且我对于player的应用比较单一:指定播放、停止关闭。
环境:windows 7 的64位操作系统,VS2008的开发环境。
代码实现:
BOOL PalySoundsWindows(const CString &strVoiceFile, CString &sError);
/******************************************************************
* 函数名称: PalySoundsWindows
* 函数说明: 启动系统windows media player程序,播放指定音频文件
* 参 数: strVoiceFile, 音频文件全路径;sError,错误代码;
* 返 回 值: BOOL
* 作 者: XXXXXXXXX
* 日 期: 2015/10/28
*******************************************************************/
BOOL CCommonFun::PalySoundsWindows(const CString &strVoiceFile, CString &sError)
{
//获取系统安装目录
CHAR szPath[MAX_PATH] = {0};
SHGetSpecialFolderPath(NULL, szPath,CSIDL_PROGRAM_FILES, FALSE);
CString sWMPlayerPath = "";
sWMPlayerPath.Format(_T("%s\\Windows Media Player\\wmplayer.exe"), szPath);
CString sVoicePath = strVoiceFile;
HINSTANCE hNewExe = ShellExecute(NULL,NULL, sWMPlayerPath, sVoicePath,NULL,SW_SHOW);
if ((DWORD)hNewExe <= 32)
{
CString sFormat;
sFormat.Format("return value:%d\n", (DWORD)hNewExe);
sError = sFormat;
return FALSE;
}
return TRUE;
}
//下面是停止windows media player程序的代码
if (CCommonFun::IsRunProcess(_T("wmplayer.exe")))
{
CCommonFun::TerminateProcessEx(_T("wmplayer.exe"));
}
/******************************************************************
* 函数介绍:结束指定进程名称
* 输入参数:
* 输出参数:
* 返回值 :
*******************************************************************/
void CCommonFun::TerminateProcessEx(const CString &sProcessName)
{
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 info;
info.dwSize = sizeof(PROCESSENTRY32);
Process32First(handle, &info);
while(Process32Next(handle, &info)!=FALSE)
{
if (sProcessName.CompareNoCase(info.szExeFile) == 0)
{
if (HANDLE hProcess = OpenProcess(PROCESS_TERMINATE,FALSE, info.th32ProcessID))
{
BOOL bOk = TerminateProcess(hProcess,0);
bOk = CloseHandle(hProcess);
}
}
}
CloseHandle(handle);
}
/******************************************************************
* 函数介绍:判断指定进程是否在运行中
* 输入参数:
* 输出参数:
* 返回值 :
*******************************************************************/
BOOL CCommonFun::IsRunProcess( const CString &sProcessName )
{
DWORD th32ProcessID = 0;//
return FindProcess(sProcessName, th32ProcessID);
}
/******************************************************************
* 函数介绍:查找进程
* 输入参数:
* 输出参数:
* 返回值 :
*******************************************************************/
BOOL CCommonFun::FindProcess(const CString &sProcessName, DWORD &th32ProcessID)
{
BOOL bResult = FALSE;
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//
//PROCESSENTRY32 *info = new PROCESSENTRY32;
//info->dwSize=sizeof(PROCESSENTRY32);
PROCESSENTRY32 info;
info.dwSize = sizeof(PROCESSENTRY32);
Process32First(handle, &info);
while (Process32Next(handle, &info) != FALSE)
{
if (sProcessName.CompareNoCase(info.szExeFile) == 0)
{
bResult = TRUE;
th32ProcessID = info.th32ProcessID;
break;
}
}
CloseHandle(handle);
return bResult;
}