zoukankan      html  css  js  c++  java
  • 判断当前窗口是否是全屏的山寨版和官方版

    山寨版很好很强大:

    简单介绍一下,这是我用过的,获取屏幕的四个顶点(具体检测的时候可以向屏幕的中心剪一个像素,譬如检测 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.   
    4. // Specify the structure size and handle to the appbar.  
    5. abd.cbSize = sizeof(APPBARDATA);  
    6. abd.hWnd = hwndAccessBar;  
    7.   
    8. abd.uCallbackMessage = MSG_APPBAR_MSGID;  
    9.   
    10. !::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.       
    26.     return CSubclassWnd::WindowProc(msg, wp, lp);  
    27. }  

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

  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/findumars/p/6143430.html
Copyright © 2011-2022 走看看