判断当前游戏是否为全屏状态

Posted by JiaJia 18 June,2009 (2)Comment
方法一:
  最简单的方法,判断当前窗口大小是否跟屏幕分辨率相同,相同则为全屏状态。不过要注意桌面进程 Explorer 的处理

方法二:
  注册一个Appbar(桌面工具栏)是类似微软视窗系统的任务条的窗口。它紧靠屏幕边缘,典型的桌面工具栏包括快速访问其他应用程序和窗口的按钮。系统会防止其他应用程序使用被appbar占用的区域。在任何时刻桌面都可以同时共存多个appbar。

使用的API: SHAppBarMessage (原型如下:)
WINSHELLAPI UINT APIENTRY SHAppBarMessage( DWORD dwMessage, PAPPBARDATA pData);

  这个API可以向系统发送一个appbar message(也就是dwMessage,有很多消息,可以查阅MSDN),然后系统通过pData返回你想知道的信息,这里我们主要用这个API来注册一个新的appbar。这里还需要关注的是APPBARDATA这个结构体。

检测全屏的具体实现代码如下:
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下偶尔会失败,很奇怪。

Related Items

Categories : 学习编程 Tags : C/C++  
Comments
2009-6-19 11:41:33

这个,不是一眼就能看出来么..

JiaJia 于 2009-6-19 12:17:56 回复
......
这是编程实现,不是用人眼看,无语。

Posted by 要命 Gravatar Icon

2009-11-1 16:49:36

我的方法是读取程序的启动参数,如果带-window启动,则判断为窗口化.
可能要比作者的方法简单些.
另外,你的加加魔兽比我的魔兽军刀做的好,特别是否为聊天状态的判断,自己的魔兽军刀有点懒得更新了,没什么新点子了.
作者可以加上一个窗口模式没标题但是带边框的选项么?谢谢.

JiaJia 于 2009-11-1 23:04:59 回复
我这个说的不是魔兽争霸...不是每个游戏窗口化运行就会带参数的...

Posted by Nicol Gravatar Icon

Leave a comment

Or, take a look at Archives and Categories

Category

Archives