判断当前窗口是否是全屏的山寨版和官方版

山寨版很好很强大:

简单介绍一下,这是我用过的,获取屏幕的四个顶点(具体检测的时候可以向屏幕的中心剪一个像素,譬如检测 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,代码如下:

[cpp] view plain copy

  1. APPBARDATA abd;
  2. memset(&abd, 0, sizeof(abd));
  3. // Specify the structure size and handle to the appbar.
  4. abd.cbSize = sizeof(APPBARDATA);
  5. abd.hWnd = hwndAccessBar;
  6. abd.uCallbackMessage = MSG_APPBAR_MSGID;
  7. !::SHAppBarMessage(ABM_NEW, &abd);

注意MSG_APPBAR_MSGID这个,这是你自己定义的消息ID,当有全屏创建或者取消的时候,会给句柄为hwndAccessBar的窗口发送消息ID为MSG_APPBAR_MSGID的消息,具体到全屏消息,此时WPARAM为ABN_FULLSCREENAPP,而LPARAM则能够判断当前是有窗口全屏了还是有窗口取消全屏了,(BOOL) lParam为TRUE表示有窗口全屏了,而(BOOL) lParam为FALSE则表示有窗口取消全屏状态了。代码如下:

[cpp] view plain copy

  1. LRESULT CWinHook::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
  2. {
  3. if (MSG_APPBAR_MSGID == msg)
  4. {
  5. switch((UINT)wp)
  6. {
  7. case ABN_FULLSCREENAPP:
  8. {
  9. if (TRUE == (BOOL)lp)
  10. {
  11. TRACE(TEXT("一个窗口全屏了/n"));
  12. KAppBarMsg::m_bFullScreen = TRUE;
  13. }
  14. else
  15. {
  16. TRACE(TEXT("一个窗口取消全屏了/n"));
  17. KAppBarMsg::m_bFullScreen = FALSE;
  18. }
  19. }
  20. break;
  21. default:
  22. break;
  23. }
  24. }
  25. return CSubclassWnd::WindowProc(msg, wp, lp);
  26. }


附注:后来发现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

http://blog.csdn.net/magictong/article/details/4085477

时间: 2024-10-24 11:00:55

判断当前窗口是否是全屏的山寨版和官方版的相关文章

Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮)

//Qt主窗口没有最小化,最大化按钮且最大化显示  int main(int argc, char *argv[]) { QApplication a(argc, argv); TestQtForWinCE w; w.setWindowFlags(w.windowFlags()& ~Qt::WindowMaximizeButtonHint& ~Qt::WindowMinimizeButtonHint); w.showMaximized(); return a.exec(); } 这里的&q

判断当前屏幕是否是全屏+是否是竖屏

我们都知道给Activity设置全屏有在主题中设置,有在代码中设置的方式.那么该怎么获得当前是否全屏呢?网上有很多文章都用的是同一个方法,这个方法我经过测试基本处于废物级别,我的是4.4.4无法使用网上流传的方法.我下面给出我自己的一个实现. /** * @param activity * @return 判断当前手机是否是全屏 */ public static boolean isFullScreen(Activity activity) { int flag = activity.getWi

【温故而知新】Javascript窗口效果 (全屏显示窗口、定时关闭窗口)

1.全屏显示窗口 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="

EasyUI,Model(模态窗口)不能全屏问题

1.打开Easy.js 2.找到 1 if (opts.modal == true) { 2 _26f.mask = $("<div class=\"window-mask\"></div>").insertAfter(_26f.window); 3 _26f.mask.css({width:(opts.inline?_26f.mask.parent().width():_273().width),height:(opts.inline?_2

Windows中检测当前是否有窗口全屏

不时看到有人问起如何判断当前是否有窗口正处于全屏状态? 不过, 在解决这个问题之前先来解决一个简单的问题?         什么是全屏?     相当一部分人认为: 窗口如果是最大化的, 那么它就是最大化的? 真是这样吗? 简直BS!. 全屏是指窗口整体大小至少占据了整个屏幕, 而不是除任务栏以外的那一部分空间! 而最大化是指窗口整体大小占据了桌面的工作区(Workarea)! 所以, 不要只是简单地调用IsZoomed()就决定窗口当前是否全屏, 那是判断是否最大化的作为; 也不要只是把窗口的

win32之全屏窗口

游戏开发中经常使用会让游戏以全屏窗口的状态运行,下面一个例子就是来实现这个效果的. #include <windows.h> void RegisterMyClass(); LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine

Chromium为视频标签&lt;video&gt;全屏播放的过程分析

在Chromium中,<video>标签有全屏和非全屏两种播放模式.在非全屏模式下,<video>标签播放的视频嵌入在网页中显示,也就是视频画面作为网页的一部分显示.在全屏模式下,我们是看不到网页其它内容的,因此<video>标签播放的视频可以在一个独立的全屏窗口中显示.这两种截然不同的播放模式,导致Chromium使用不同的方式渲染视频画面.本文接下来就详细分析<video>标签全屏播放的过程. 从前面Chromium为视频标签<video>渲

Fullscreen API 全屏显示网页

第一次看到应用 Fullscreen API 全屏显示网页,是 FaceBook 中的照片放大.作为一个比较新的 API,目前只有 Safari.Chrome 和 FireFox 三种浏览器支持该特性.因为尚未发布正式版的标准,所以必须使用浏览器特定的方法,也就是应用添加前缀(webit/moz)的方法. 这个 API 不仅能够使整个页面全屏显示,也可以使页面中的某个元素全屏显示.它的设计初衷是为了全屏显示 HTML5 视频和游戏,以便更全面的替代 flash 功能.尽管还有很多有待完善的地方,

远程桌面退出全屏/不能全屏/全屏切换的技巧

远程桌面退出全屏/不能全屏/全屏切换的技巧退出全屏 问:我的电脑远程登录到服务器上并且切换到了全屏状态,全屏后发现桌面顶部没有浮动工具栏了,想退出全屏状态,不知如何退出了,最后,只有重启电脑.想知道如何退出远程桌面的全屏方法? 答:退出远程桌面全屏状态方法,按下"Ctrl+Alt+Break"组合键,即可切换到普通屏幕状态. 全屏消失 问:Windows 7 下,远程桌面连接前,可以在属性中设置全屏,连接成功后也是全屏,可是如果切换回本地后,全屏就消失了,似乎再也回不去全屏了. 答:方