如何检测是否有程序全屏显示

赤勇玄心行天道 2014-07-19 07:02:58
我现在要做一个实时置顶显示的窗口,但是我发现如果有其他程序全屏显示时,会和其他程序抢置顶位置,所以我想做一个检测,当有程序全屏显示时,就我的程序不再置顶显示了,100分问各位大侠们有没有办法做到?
...全文
1314 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
以下是我最终总结的代码,我觉得已经很完美了,大家看看吧:

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 函数名称:IsForegroundFullscreen
 * 功能说明:判断当前正在与用户交互的当前激活窗口是否是全屏的。
 * 参数说明:无
 * 返回说明:true:是。
             false:否。
 * 线程安全:是
 * 调用样例:IsForegroundFullscreen (),表示判断当前正在与用户交互的当前激活窗口是否是全屏的。
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

bool CFunc::IsForegroundFullscreen ()
{
    bool bFullscreen = false;//存放当前激活窗口是否是全屏的,true表示是,false表示不是
    HWND hWnd;
    RECT rcApp;
	RECT rcDesk;

	hWnd = GetForegroundWindow ();//获取当前正在与用户交互的当前激活窗口句柄

    if ((hWnd != GetDesktopWindow ()) && (hWnd != GetShellWindow ()))//如果当前激活窗口不是桌面窗口,也不是控制台窗口
	{
		GetWindowRect (hWnd, &rcApp);//获取当前激活窗口的坐标
		GetWindowRect (GetDesktopWindow(), &rcDesk);//根据桌面窗口句柄,获取整个屏幕的坐标

        if (rcApp.left <= rcDesk.left && //如果当前激活窗口的坐标完全覆盖住桌面窗口,就表示当前激活窗口是全屏的
            rcApp.top <= rcDesk.top &&
            rcApp.right >= rcDesk.right &&
            rcApp.bottom >= rcDesk.bottom)
        {
            
			char szTemp[100];

			if (GetClassName (hWnd, szTemp, sizeof (szTemp)) > 0)//如果获取当前激活窗口的类名成功
			{
				if (strcmp (szTemp, "WorkerW") != 0)//如果不是桌面窗口的类名,就认为当前激活窗口是全屏窗口
					bFullscreen = true;
			}
			else bFullscreen = true;//如果获取失败,就认为当前激活窗口是全屏窗口
        }
    }//如果当前激活窗口是桌面窗口,或者是控制台窗口,就直接返回不是全屏

    return bFullscreen;
}
dvlinker 2014-09-11
  • 打赏
  • 举报
回复
这比较简单,方法也有很多
fronz 2014-08-27
  • 打赏
  • 举报
回复
这个需要复合判断,至于判断的要点,要根据你的实际目的,不了解不好细说 比如可以尝试上面判断全屏的标准之外,加入是否获得焦点等等。
向立天 2014-08-11
  • 打赏
  • 举报
回复
这个比较麻烦 你说的情况应该是类似游戏那种全屏程序 对于这类程序 屏幕是一种资源 程序申请到屏幕资源其他窗口显示就会受影响 至于怎么判断我也不太清楚 每具体研究过
赵4老师 2014-08-11
  • 打赏
  • 举报
回复
“有某个程序正在全屏显示” 这是一个伪命题。
赵4老师 2014-08-10
  • 打赏
  • 举报
回复
引用 25 楼 cyz7758520 的回复:
[quote=引用 24 楼 zhao4zhong1 的回复:] 不全屏显示的窗口也可能占用屏幕上所有像素的位置.
难道占用屏幕上所有像素的窗口不叫做全屏吗?[/quote] 在www.codeproject.com搜fish
tianyuan521521 2014-08-10
  • 打赏
  • 举报
回复
你说的是窗口最大化 还是窗口fullscreen
帐号已注销 2014-08-10
  • 打赏
  • 举报
回复
引用 27 楼 zhao4zhong1 的回复:
[quote=引用 25 楼 cyz7758520 的回复:] [quote=引用 24 楼 zhao4zhong1 的回复:] 不全屏显示的窗口也可能占用屏幕上所有像素的位置.
难道占用屏幕上所有像素的窗口不叫做全屏吗?[/quote] 在www.codeproject.com搜fish[/quote] 应该是带有alpha的窗体吧, 那还真不好解决了, 赵老师给出一个办法吧~
  • 打赏
  • 举报
回复
引用 24 楼 zhao4zhong1 的回复:
不全屏显示的窗口也可能占用屏幕上所有像素的位置.
难道占用屏幕上所有像素的窗口不叫做全屏吗?
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
不全屏显示的窗口也可能占用屏幕上所有像素的位置.
帐号已注销 2014-08-07
  • 打赏
  • 举报
回复
引用 22 楼 cyz7758520 的回复:
[quote=引用 10 楼 vbgkj 的回复:] 试试这个吧~~~
#include <windows.h>
#include <iostream>

bool CheckFullscreen()
{
	bool bFullScreen = false;
	HWND hWnd = GetForegroundWindow();
	RECT rcApp, rcDesk;
	GetWindowRect(GetDesktopWindow(), &rcDesk);
	if(hWnd!=GetDesktopWindow() && hWnd!=GetShellWindow()){
		GetWindowRect(hWnd, &rcApp);
		if(rcApp.left<=rcDesk.left
			&& rcApp.top<=rcDesk.top
			&& rcApp.right>=rcDesk.right
			&& rcApp.bottom>=rcDesk.bottom)
		{
			bFullScreen = true;
		}
	}
	return bFullScreen;
}

int main()
{
	for(;;){
		std::cout << (CheckFullscreen()?"有":"没有") << "窗口全屏~\n";
		Sleep(2000);
	}
	return 0;
}
大侠,我发现一个问题,当我显示桌面的时候,这个函数也会认为当前激活窗口是全屏的,没有过滤掉桌面窗口。[/quote] 那就多加个判断

#include <windows.h>
#include <tchar.h>
#include <iostream>

bool CheckFullscreen()
{
	bool bFullScreen = false;
	HWND hWnd = GetForegroundWindow();
	if (hWnd != GetDesktopWindow() && hWnd != GetShellWindow()){
		RECT rcApp, rcDesk;
		GetWindowRect(GetDesktopWindow(), &rcDesk);
		GetWindowRect(hWnd, &rcApp);
		if (rcApp.left <= rcDesk.left
			&& rcApp.top <= rcDesk.top
			&& rcApp.right >= rcDesk.right
			&& rcApp.bottom >= rcDesk.bottom)
		{
			bFullScreen = true;
		}
		if (bFullScreen){
			TCHAR cls[128] = { 0 };
			GetClassName(hWnd, cls, _countof(cls));
			if (_tcscmp(cls, _T("WorkerW")) == 0){
				bFullScreen = false;
			}
		}
	}
	return bFullScreen;
}

int main()
{
	for (;;){
		std::cout << (CheckFullscreen() ? "有" : "没有") << "窗口全屏~\n";
		Sleep(1000);
	}
	return 0;
}
  • 打赏
  • 举报
回复
引用 10 楼 vbgkj 的回复:
试试这个吧~~~
#include <windows.h>
#include <iostream>

bool CheckFullscreen()
{
	bool bFullScreen = false;
	HWND hWnd = GetForegroundWindow();
	RECT rcApp, rcDesk;
	GetWindowRect(GetDesktopWindow(), &rcDesk);
	if(hWnd!=GetDesktopWindow() && hWnd!=GetShellWindow()){
		GetWindowRect(hWnd, &rcApp);
		if(rcApp.left<=rcDesk.left
			&& rcApp.top<=rcDesk.top
			&& rcApp.right>=rcDesk.right
			&& rcApp.bottom>=rcDesk.bottom)
		{
			bFullScreen = true;
		}
	}
	return bFullScreen;
}

int main()
{
	for(;;){
		std::cout << (CheckFullscreen()?"有":"没有") << "窗口全屏~\n";
		Sleep(2000);
	}
	return 0;
}
大侠,我发现一个问题,当我显示桌面的时候,这个函数也会认为当前激活窗口是全屏的,没有过滤掉桌面窗口。
smilecabbage 2014-07-29
  • 打赏
  • 举报
回复
引用 19 楼 cyz7758520 的回复:
[quote=引用 17 楼 smilecabbage 的回复:] 这个看了你们说的那么多方法,感觉还是 “fishion” 说的比较正确 , 楼去想下 ,如果有的窗口时全屏的,但是他的子窗口在激活状态, 用上面的那些 GetForegroundWindow 这些就都有问题了。 所以呢 ,只有枚举 。 EnumWindow 枚举了过后 ,判断是否是 IsZoomed() (是否是最大化) ,或者是 判断 程序的长宽等信息 。不过要除掉任务栏 的区域 ,上面那些获取屏幕长宽的的都是有问题的。
请问为什么要除去任务栏的区域呢?[/quote] 去掉任务栏的获取工作区可以这样: CRect rcWorkArea; SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID)&rcWorkArea, 0); 楼主看了下,之前我错了, 没正确的理解全屏。 上面的一些答案应该有对的,获取全屏的函数有很多 。比如2楼的 tiger9991 的 1. int x, y; 2. x = GetSystemMetrics(SM_CXSCREEN);//屏幕宽度 3. y = GetSystemMetrics(SM_CYSCREEN);//屏幕高度 但是每类软件的样式不一样,做全屏的方式也不一定都一样,感觉有的软件全屏时 的大小不一定都一样。所以还是得定个范围 >某个值吧 。 楼主可以去检测下一些常用的全屏软件的全屏大小。再做定夺。
  • 打赏
  • 举报
回复
引用 20 楼 smilecabbage 的回复:
[quote=引用 19 楼 cyz7758520 的回复:] [quote=引用 17 楼 smilecabbage 的回复:] 这个看了你们说的那么多方法,感觉还是 “fishion” 说的比较正确 , 楼去想下 ,如果有的窗口时全屏的,但是他的子窗口在激活状态, 用上面的那些 GetForegroundWindow 这些就都有问题了。 所以呢 ,只有枚举 。 EnumWindow 枚举了过后 ,判断是否是 IsZoomed() (是否是最大化) ,或者是 判断 程序的长宽等信息 。不过要除掉任务栏 的区域 ,上面那些获取屏幕长宽的的都是有问题的。
请问为什么要除去任务栏的区域呢?[/quote] 去掉任务栏的获取工作区可以这样: CRect rcWorkArea; SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID)&rcWorkArea, 0); 楼主看了下,之前我错了, 没正确的理解全屏。 上面的一些答案应该有对的,获取全屏的函数有很多 。比如2楼的 tiger9991 的 1. int x, y; 2. x = GetSystemMetrics(SM_CXSCREEN);//屏幕宽度 3. y = GetSystemMetrics(SM_CYSCREEN);//屏幕高度 但是每类软件的样式不一样,做全屏的方式也不一定都一样,感觉有的软件全屏时 的大小不一定都一样。所以还是得定个范围 >某个值吧 。 楼主可以去检测下一些常用的全屏软件的全屏大小。再做定夺。 [/quote] 恩恩,好的,谢谢你,我大概检测了一下,一般全屏窗口的大小都是等于屏幕的大小,所以我认为应该问题不大。
  • 打赏
  • 举报
回复
引用 17 楼 smilecabbage 的回复:
这个看了你们说的那么多方法,感觉还是 “fishion” 说的比较正确 , 楼去想下 ,如果有的窗口时全屏的,但是他的子窗口在激活状态, 用上面的那些 GetForegroundWindow 这些就都有问题了。 所以呢 ,只有枚举 。 EnumWindow 枚举了过后 ,判断是否是 IsZoomed() (是否是最大化) ,或者是 判断 程序的长宽等信息 。不过要除掉任务栏 的区域 ,上面那些获取屏幕长宽的的都是有问题的。
请问为什么要除去任务栏的区域呢?
fishion 2014-07-24
  • 打赏
  • 举报
回复
定时通过EnumWindow来遍历窗口,看看哪个窗口的大小是屏幕的高度宽度大小值
schlafenhamster 2014-07-24
  • 打赏
  • 举报
回复
看看: if(rcApp.left<=rcDesk.left && rcApp.top<=rcDesk.top rcDesk.left 和 rcDesk.top 是不是 =0?
  • 打赏
  • 举报
回复
引用 10 楼 vbgkj 的回复:
试试这个吧~~~
#include <windows.h>
#include <iostream>

bool CheckFullscreen()
{
	bool bFullScreen = false;
	HWND hWnd = GetForegroundWindow();
	RECT rcApp, rcDesk;
	GetWindowRect(GetDesktopWindow(), &rcDesk);
	if(hWnd!=GetDesktopWindow() && hWnd!=GetShellWindow()){
		GetWindowRect(hWnd, &rcApp);
		if(rcApp.left<=rcDesk.left
			&& rcApp.top<=rcDesk.top
			&& rcApp.right>=rcDesk.right
			&& rcApp.bottom>=rcDesk.bottom)
		{
			bFullScreen = true;
		}
	}
	return bFullScreen;
}

int main()
{
	for(;;){
		std::cout << (CheckFullscreen()?"有":"没有") << "窗口全屏~\n";
		Sleep(2000);
	}
	return 0;
}
这位高手正解呀!小弟我长知识了,我把高手的代码添加了注释,如下:

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 函数名称:IsForegroundFullscreen
 * 功能说明:判断当前正在与用户交互的前台窗口是否是全屏的。
 * 参数说明:无
 * 返回说明:true:是。
             false:否。
 * 线程安全:是
 * 调用样例:IsForegroundFullscreen (),表示判断当前正在与用户交互的前台窗口是否是全屏的。
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

bool IsForegroundFullscreen ()
{
    bool bFullscreen = false;//存放前台窗口是否是全屏的,true表示是,false表示不是
    HWND hWnd;
    RECT rcApp;
	RECT rcDesk;

	hWnd = GetForegroundWindow ();//获取当前正在与用户交互的前台窗口句柄

    if ((hWnd != GetDesktopWindow ()) && (hWnd != GetShellWindow ()))//如果前台窗口不是桌面窗口,也不是控制台窗口
	{
		GetWindowRect (hWnd, &rcApp);//获取前台窗口的坐标
		GetWindowRect (GetDesktopWindow(), &rcDesk);//根据桌面窗口句柄,获取整个屏幕的坐标

        if (rcApp.left <= rcDesk.left && //如果前台窗口的坐标完全覆盖住桌面窗口,就表示前台窗口是全屏的
            rcApp.top <= rcDesk.top &&
            rcApp.right >= rcDesk.right &&
            rcApp.bottom >= rcDesk.bottom)
        {
            bFullscreen = true;
        }
    }//如果前台窗口是桌面窗口,或者是控制台窗口,就直接返回不是全屏

    return bFullscreen;
}
caewow 2014-07-24
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
CWnd *pwnd=GetForegroundWindow(); CRect rc; pwnd->GetWindowRect(&rc); if((rc.left<=0) && (rc.top<=0)) { AfxMessageBox("Foreground Window is Full Screen!"); }
只检查这两个值还不够,这个不严谨的。
引用 14 楼 fishion 的回复:
定时通过EnumWindow来遍历窗口,看看哪个窗口的大小是屏幕的高度宽度大小值
我认为这个回答最靠谱。
smilecabbage 2014-07-24
  • 打赏
  • 举报
回复
这个看了你们说的那么多方法,感觉还是 “fishion” 说的比较正确 , 楼去想下 ,如果有的窗口时全屏的,但是他的子窗口在激活状态, 用上面的那些 GetForegroundWindow 这些就都有问题了。 所以呢 ,只有枚举 。 EnumWindow 枚举了过后 ,判断是否是 IsZoomed() (是否是最大化) ,或者是 判断 程序的长宽等信息 。不过要除掉任务栏 的区域 ,上面那些获取屏幕长宽的的都是有问题的。
加载更多回复(13)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧