这几天做个在PPC上面小项目,需要在程序里播放视频文件,
最初的想法是在程序的弹出对话框里面插入wmp控件,但是没有成功,没有查处到底为什么,
因为对平台不是很了解,且时间紧张,故放弃,转而采用启动wmp进程,播放,关闭,这样
的操作过程。
使用VS2005开发,SDK为:PPC 2003;
一)启动比较简单:
就用调用ShellExcute,在PPC 2003里面没有ShellExcute,只有ShellExcuteEx,其实都
一样的,只是封装而已;
//播放;
CString strFileName;(L"video.wmv");
strFileName = m_strFilePath + strFileName; //取得播放文件的绝对路径;
memset(&m_objCreateProcess,0,sizeof(m_objCreateProcess));
m_objCreateProcess.cbSize = sizeof(m_objCreateProcess);
m_objCreateProcess.lpVerb=L"open";
m_objCreateProcess.lpFile=strFileName.GetBuffer();
//注意:这里用了windows系统的文件关联,
//如果这里传入的是wmplayer.exe那么只是打开了wnp,
//即使传入的参数有文件名,也会报错,
m_objCreateProcess.fMask = SEE_MASK_CLASSNAME;
m_objCreateProcess.nShow= SW_HIDE;
ShellExecuteEx(&m_objCreateProcess);
//wmplayer.exe被启动了,播放了(那个开心啊,,,,,)
二)关闭进程比较稍微麻烦点:
大家都知道,在PPC里面关闭wmplayer(按右上角的X或者OK),播放窗口被关闭,但是
wmplayer进程还是在播放的。
下面是我试的几种方法:
1)找到wmplayer.exe的窗口,然后发生WM_CLOSE:没有成功;
分析:PPC里面按wmplayer.exe右上角的X或者ok是关闭窗口,但是进程还在,
关闭了窗口以后,再发生WM_CLOSE,就没有反应了。
2)TerminationProcess:
这个是可以的,但是一定要通过进程快照,找到wmplayer.exe,然后terminationprocess,
如果只是通过ShellExcuteEX得到的wmplayer.exe的句柄,这个是关不掉的,MSDN里面说的很清楚,
不保证正确;
后来仔细想了想,PPC自带的设置->内存->停止这个功能也是按照下面的方法做的;
另外VS2005里面的远程工具中的进程查看器,也应该是用的这种方法;
下面是关闭wmpplayer.exe进程代码:
#include <Tlhelp32.h>
#pragma comment( lib, "Toolhelp") //这个用到Toolhelp库;
StopMediaPlayer()
{
HINSTANCE hKernel = NULL;
HINSTANCE hProcessSnap = NULL;
PROCESSENTRY32 pe32={0};
DWORD dwTaskCount = 0;
//创建进程映射
hProcessSnap = (HINSTANCE)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE){
DWORD dwError = GetLastError();
return ;
}
dwTaskCount = 0;
pe32.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap, &pe32)){
do{