MFC 实现检测ppt是否正在播放

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下载

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值