1.分类
ppt目前包括微软的powerpiont,以及wps的ppt,所以检测ppt要兼容这两种
2.实现原理
(1)先通过获取顶层窗口的句柄,得到进程的id,然后获取windows桌面四个角处的点的窗口句柄,得到各自的进程句柄,如果顶层窗口的进程id与四个角的点处的进程id都相等,则认为是全屏状态
BOOL IsFullScreenActive( DWORD &dwProcessID )
{
/*
这个函数获取屏幕4角的窗口的进程句柄,判断与激活句柄是否相等的方式来判断是否全屏程序。
特别的,对 IE 之类的多标签多进程程序,子窗口的进程会和主窗口不同。需要获取窗口的主窗口来对比才可以
*/
bool lbRet = false;
HWND lHforewnd=::GetForegroundWindow();
DWORD lWDProcessID;
GetWindowThreadProcessId( lHforewnd, &lWDProcessID );
// 获取屏幕大小
int iCx=GetSystemMetrics(SM_CXSCREEN);
int iCy=GetSystemMetrics(SM_CYSCREEN);
do
{
if( CheckSame(lWDProcessID,0,0) ==false)
break;
if( CheckSame(lWDProcessID,iCx-1,0) ==false)
break;
if( CheckSame(lWDProcessID,0,iCy-1) ==false)
break;
if( CheckSame(lWDProcessID,iCx-1,iCy-1) ==false)
break;
lbRet = true;
} while (false);
if (lbRet)
{
dwProcessID = lWDProcessID;
}
return lbRet;
}
bool CheckSame( DWORD dwProcessID,int niX,int niY )
{
bool lbRet = false;
POINT lpt={niX,niY};
HWND lhwnd= (HWND)WindowFromPoint (lpt);
HWND lHdesktop= (HWND)GetDesktopWindow();
HWND lHparent=0;
for(;;)
{ // 查找窗口的主窗口
lHparent= ::GetParent(lhwnd);
if( lHparent==lHdesktop || lHparent==0 )
break;
lhwnd=lHparent;
}
DWORD dwPid=0;
GetWindowThreadProcessId( lhwnd, &dwPid );
if (dwPid == dwProcessID)
{
lbRet = true;
}
else
{
lbRet = false;
}
return lbRet;
}
2.根据全屏状态下的进程id,得到进程的名称,判断是否是ppt的进程
bool IsPptPlaying()
{
DWORD lWDProcessID;
BOOL bRst = IsFullScreenActive(lWDProcessID);
if (bRst)
{
CString strName;
ProcessIdToName(strName, lWDProcessID);
strName.MakeLower();
if (strName == _T("wpp.exe")
||strName == _T("powerpnt.exe"))
{
return true;
}
}
return false;
}
BOOL ProcessIdToName( CString &strProcessName, DWORD dwPID )
{
PROCESSENTRY32 pe;
DWORD id=0;
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize=sizeof(PROCESSENTRY32);
if(!Process32First(hSnapshot,&pe))
{
return FALSE;
}
pe.dwSize=sizeof(PROCESSENTRY32);
while(Process32Next(hSnapshot,&pe) != FALSE)
{
if (pe.th32ProcessID == dwPID)
{
strProcessName.Format(_T("%s"), pe.szExeFile);
break;
}
}
CloseHandle(hSnapshot);
return TRUE;
}
(3)创建个线程调用上述函数用于检测ppt
AfxBeginThread(ThreadPpt, this);
UINT ThreadPpt(LPVOID pParam)
{
static bool bStatusChange = false;//用于判断状态是否改变
bool bPlaying = false;
while (!pThis->m_bPptExit)
{
bPlaying = CPpt::IsPptPlaying();
if ( bPlaying )
{
if ( !bStatusChange )
{
//处理ppt播放状态
...
bStatusChange = true;
}
}
else
{
if ( bStatusChange )
{
//处理ppt未播放状态
...
bStatusChange = false;
}
}
Sleep(1000);
}
return 0;
}
具体代码下载:Demo下载