判断当前窗口是否是全屏的山寨版和官方版
山寨版很好很强大:
简单介绍一下,这是我用过的,获取屏幕的四个顶点(具体检测的时候可以向屏幕的中心剪一个像素,譬如检测 1,1而不是0,0)所在窗口的句柄,如果四个句柄都相同,则认为是全屏状态,其实有个问题,有些程序全屏的时候,还会有窗口弹出来,典型的像播放软件,全屏的时候,下面还有一个工具栏,这个工具栏和后面的播放窗口是不同的,所以检测失败了。对这种方法加强就是,获取四个点窗口所在的进程PID,如果PID想同,则认为是全屏,但是仍然有问题,检测explorer的时候就直接认为是全屏了,呵呵,所以要过滤。总之实现简单,但是不准,不推荐使用。
官方的推荐做法:
注册一个Appbar(桌面工具栏)是类似微软视窗系统的任务条的窗口。它紧靠屏幕边缘,典型的桌面工具栏包括快速访问其他应用程序和窗口的按钮。系统会防止其他应用程序使用被appbar占用的区域。在任何时刻桌面都可以同时共存多个appbar。
使用的API:
SHAppBarMessage
WINSHELLAPI UINT APIENTRY SHAppBarMessage( DWORD dwMessage, PAPPBARDATA pData);
这个API可以向系统发送一个appbar message(也就是dwMessage,有很多消息,可以查阅MSDN),然后系统通过pData返回你想知道的信息,这里我们主要用这个API来注册一个新的appbar。这里还需要关注的是APPBARDATA这个结构体。
检测全屏的具体实现。
这里要先通过调用SHAppBarMessage(ABM_NEW, &abd)来注册一个appbar,代码如下:
APPBARDATA abd; memset(&abd, 0, sizeof(abd)); // Specify the structure size and handle to the appbar. abd.cbSize = sizeof(APPBARDATA); abd.hWnd = hwndAccessBar; abd.uCallbackMessage = MSG_APPBAR_MSGID; !::SHAppBarMessage(ABM_NEW, &abd);
注意MSG_APPBAR_MSGID这个,这是你自己定义的消息ID,当有全屏创建或者取消的时候,会给句柄为hwndAccessBar的窗口发送消息ID为MSG_APPBAR_MSGID的消息,具体到全屏消息,此时WPARAM为ABN_FULLSCREENAPP,而LPARAM则能够判断当前是有窗口全屏了还是有窗口取消全屏了,(BOOL) lParam为TRUE表示有窗口全屏了,而(BOOL) lParam为FALSE则表示有窗口取消全屏状态了。代码如下:
LRESULT CWinHook::WindowProc(UINT msg, WPARAM wp, LPARAM lp) { if (MSG_APPBAR_MSGID == msg) { switch((UINT)wp) { case ABN_FULLSCREENAPP: { if (TRUE == (BOOL)lp) { TRACE(TEXT("一个窗口全屏了/n")); KAppBarMsg::m_bFullScreen = TRUE; } else { TRACE(TEXT("一个窗口取消全屏了/n")); KAppBarMsg::m_bFullScreen = FALSE; } } break; default: break; } } return CSubclassWnd::WindowProc(msg, wp, lp); }
附注:后来发现vista下面没有XP下灵敏,不知道怎么回事,vista下偶尔会失败,很奇怪。
参考MSDN2005:
APPBARDATA Structure
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WIN32COM.v10.en/shellcc/platform/shell/reference/structures/appbardata.htm
ABM_NEW Message
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WIN32COM.v10.en/shellcc/platform/shell/reference/messages/abm_new.htm
ABN_FULLSCREENAPP Notification
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WIN32COM.v10.en/shellcc/platform/shell/reference/messages/abn_fullscreenapp.htm
判断当前窗口是否是全屏的山寨版和官方版相关推荐
- 【温故而知新-Javascript】窗口效果 (全屏显示窗口、定时关闭窗口)
1.全屏显示窗口 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮)
Qt窗口中的一些小技术总结 //Qt主窗口没有最小化,最大化按钮且最大化显示 int main(int argc, char *argv[]) { QApplication a(argc, argv ...
- java窗口如何定时关闭_[Java教程]【温故而知新】Javascript窗口效果 (全屏显示窗口、定时关闭窗口)_星空网...
[温故而知新]Javascript窗口效果 (全屏显示窗口.定时关闭窗口) 2014-10-30 0 1.全屏显示窗口 全屏显示窗口 2.定时关闭窗口 定时关闭窗口 来源:<HTML.CSS.J ...
- Qt 窗口最大化,全屏无边框显示
//窗口最大化 setWindowState(Qt::WindowMaximized); 用这个要比用showMaximized好 //全屏无边框显示 setWindowState(Qt::Windo ...
- CAD显示全屏控件(网页版)
主要用到函数说明: MxDrawXCustomFunction::Mx_FullScreen 全屏显示控件,详细说明如下: 参数 说明 int iFull = 2 0: 不完屏,1:全屏,2:自动切换 ...
- java 俄罗斯方块窗口_[代码全屏查看]-java 俄罗斯方块
[1].[代码] [Java]代码 package com; import java.awt.Color; import java.awt.Graphics; import java.awt.even ...
- [ubuntu] tmux 窗口不是全屏
具体问题:https://unix.stackexchange.com/questions/20878/tmux-not-scaling-to-fill-the-window 我使用 windows ...
- 如何在windows下使DOS窗口最大化(全屏)
运行--->cmd 在DOS窗口下输入命令 wmic 然后单击最大化后 这时DOS窗口变成最大化了,就这么简单 在DOS窗口下输入命令 quit 退出wmic 效果如:
- android全屏命令,微信全屏表情指令2020安卓版-2020微信满屏幕表情指令软件v7.0.19 清爽版-007游戏网...
2020微信满屏幕表情指令软件,是本站独家才有的一款微信表情代码APP,无需进行特别的技巧,就可以让你们在平常或者过年的期间正常的使用,享受个性化的表情带来的无限互动乐趣. 微信表情雨2020有效词有 ...
最新文章
- 汇编语言w3c_w3cschoolc语言教程
- spring IOC和DI
- 某种密码(password.*)
- python策略模式_设计模式(python实现):策略模式
- linux centos7开启IP转发、路由转发解决docker 端口映射 及外部无法访问问题
- VTK:Dijkstra 图形测地线路径用法实战
- redis集群搭建踩坑笔记
- 前端页面内含外显相关知识
- instagram架构_如何为亚马逊,Instagram,Zalando和天猫生成产品图像
- leetcode1576 (2022.1.5)
- 三星Galaxy A90 5G版通过认证:有望成为最便宜的5G手机
- java ordered list_Java - JSON对象和ListOrderedMap问题
- 偏差(bias)、方差(variance)和噪音(noise)
- MongoDB CRUD命令操作
- [转载][翻译]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[1]
- 1.maven下仅shiro框架对shiro的测试使用
- tomcat 7配置ssl教程
- VS2017的C++开发心得(一)VS的项目创建
- JAVA自行车类代码_你好 请问你还有 java Web编写的自行车租赁管理系统源代码么...
- python泰坦尼克号数据分析_Python实战—泰坦尼克号生还者数据分析