当前位置: 移动技术网 > 移动技术>移动开发>IOS > 多显示器下判断ppt是否全屏播放

多显示器下判断ppt是否全屏播放

2020年07月13日  | 移动技术网移动技术  | 我要评论
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <iostream>
#include <TlHelp32.h>
#include <vector>
#include <algorithm>

std::string GetModuleName(DWORD dwPid);

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor,
	HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
	static BOOL first = TRUE;   //标志
	std::vector<RECT> * pRect = (std::vector<RECT>*)dwData;
	//保存显示器信息
	MONITORINFO monitorinfo;
	monitorinfo.cbSize = sizeof(MONITORINFO);

	//获得显示器信息,将信息保存到monitorinfo中
	GetMonitorInfo(hMonitor, &monitorinfo);
	//若检测到主屏
	if (monitorinfo.dwFlags == MONITORINFOF_PRIMARY)
	{
		if (first)  //第一次检测到主屏
		{
			first = FALSE;
			pRect->push_back(monitorinfo.rcMonitor);
		}
		else //第二次检测到主屏,说明所有的监视器都已经检测了一遍,故可以停止检测了
		{
			first = TRUE;    //标志复位
			return FALSE;    //结束检测
		}
	}
	else
	{
		pRect->push_back(monitorinfo.rcMonitor);
	}
	first = TRUE;     // 恢复主屏标记为初始状态
	return TRUE;
}


//根据屏幕上指定的坐标点,获取坐标点窗口对应的pid
DWORD GetPidByPoint(int nX, int nY)
{
	bool bRet = false;

	POINT lpt = { nX,nY };
	HWND hwnd = (HWND)WindowFromPoint(lpt);
	HWND lHdesktop = (HWND)GetDesktopWindow();
	HWND lHparent = 0;

	while (1)
	{
		// 查找窗口的主窗口  
		lHparent = ::GetParent(hwnd);
		if (lHparent == lHdesktop || lHparent == 0)
			break;
		hwnd = lHparent;
	}

	DWORD dwPid = 0;
	GetWindowThreadProcessId(hwnd, &dwPid);
	return dwPid;
}

//查找全屏的应用窗口
BOOL FindFullScreenWindow(DWORD &dwProcessID, std::string &strProcessName, HWND &hWnd)
{
	// 检测显示器数量
	std::vector<RECT> vRect;
	EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&vRect);  // 枚举所有显示器的Rect


	/*
   这个函数获取屏幕4角的窗口的进程句柄,判断与激活句柄是否相等的方式来判断是否全屏程序。
   特别的,对 IE 之类的多标签多进程程序,子窗口的进程会和主窗口不同。需要获取窗口的主窗口来对比才可以
   */
	//bool lbRet = false;
	//HWND lHforewnd = (HWND)0x430a4a;// ::GetForegroundWindow();
	//DWORD lWDProcessID;
	//GetWindowThreadProcessId(lHforewnd, &lWDProcessID);

	std::vector<RECT>::iterator itor = vRect.begin();
	for (; itor != vRect.end(); itor++)
	{
		int nLeftPoint = itor->left;
		int nTopPoint = itor->top;
		int nRightPoint = itor->right;
		int nBottomPoint = itor->bottom;

		//左上
		DWORD dwLTPid = GetPidByPoint(nLeftPoint, nTopPoint);

		//右下
		DWORD dwRBPid = GetPidByPoint(nRightPoint - 1, nBottomPoint - 1);

		//找到全屏应用
		if (dwLTPid == dwRBPid)
		{
			dwProcessID = dwLTPid;
			strProcessName = GetModuleName(dwProcessID);
			POINT lpt = { nLeftPoint, nTopPoint };
			hWnd = (HWND)WindowFromPoint(lpt);
			return true;
		}
	}

	return false;
}

bool IsPptPlaying()
{
	DWORD dwProcessID = 0;
	std::string strProcessName;
	HWND hWnd = NULL;
	BOOL bRst = FindFullScreenWindow(dwProcessID, strProcessName, hWnd);
	if (bRst)
	{
		std::string strDst;
		//转换成小写
		std::transform(strProcessName.begin(), strProcessName.end(), std::back_inserter(strDst), ::tolower);

		if (strDst == _T("wpp.exe") || strDst == _T("powerpnt.exe"))
		{
			printf("%s is playing ...\n", strDst.c_str());
			return true;
		}
	}

	printf("nothing is playing ...\n");
	return false;
}

//根据进程id获得进程名
std::string GetModuleName(DWORD dwPid)
{
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, dwPid);
	if (INVALID_HANDLE_VALUE == hSnapshot)
	{
		return "";
	}
	PROCESSENTRY32 pe = { sizeof(pe) }; //存放进程快照信息的结构体
	BOOL ret = Process32First(hSnapshot, &pe); //获得第一个进程的信息
	//遍历
	while (ret)
	{
		if (dwPid == pe.th32ProcessID)
		{
			CloseHandle(hSnapshot);
			return std::string(pe.szExeFile);
		}
		ret = Process32Next(hSnapshot, &pe); //接着往下遍历
	}
	return "";
}

int main(int argc, _TCHAR* argv[])
{
	bool bPlaying = IsPptPlaying();
	if (bPlaying)
	{
		printf("ppt is playing \n");
	}
	else
	{
		printf("ppt not playing \n");
	}

	getchar();

	return 0;
}

 

本文地址:https://blog.csdn.net/zhuxian2009/article/details/107261853

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网