C++ 如何区分外部显示器与笔记本电脑';什么是屏幕本身?

C++ 如何区分外部显示器与笔记本电脑';什么是屏幕本身?,c++,c,windows,winapi,C++,C,Windows,Winapi,让我解释一下我的情况。我编写了一个程序,仅当用户看到屏幕时才执行某些绘图/渲染操作。对于笔记本,这意味着——只有当盖子打开时。为了确定我是否使用PBT_POWERSETTINGCHANGE通知进行GUID_LIDSWITCH_STATE_更改,这对于单监视器系统非常有用 当一个或多个外部连接的显示器连接到笔记本电脑时,就会出现此问题。在这种情况下,笔记本电脑主屏幕可能会保持非活动状态,而只有外部显示器通电。因此,在这种情况下,盖子将被报告为关闭,这将使我的程序继续渲染。问题是如何检测这种情况 我

让我解释一下我的情况。我编写了一个程序,仅当用户看到屏幕时才执行某些绘图/渲染操作。对于笔记本,这意味着——只有当盖子打开时。为了确定我是否使用PBT_POWERSETTINGCHANGE通知进行GUID_LIDSWITCH_STATE_更改,这对于单监视器系统非常有用

当一个或多个外部连接的显示器连接到笔记本电脑时,就会出现此问题。在这种情况下,笔记本电脑主屏幕可能会保持非活动状态,而只有外部显示器通电。因此,在这种情况下,盖子将被报告为关闭,这将使我的程序继续渲染。问题是如何检测这种情况

我想我可以使用
GetSystemMetrics(SM\u CMONITORS)
计算监视器的数量,但在这种情况下,我不知道监视器“来自何处”,或者换句话说,它是笔记本电脑的“本机”屏幕,还是外部插入的屏幕


所以我的问题是,我能区分插入系统的任何外部监视器和笔记本电脑的“本机”屏幕吗?

您可以调用并查询MonitorInfo结构中返回的标志。查找MonitorInfo_PRIMARY。

您可以调用并查询MonitorInfo结构中返回的标志。查找MonitorInfo_PRIMARY。

您可以调用并查询MonitorInfo结构中返回的标志。查找MonitorInfo_PRIMARY。

您可以调用并查询MonitorInfo结构中返回的标志。寻找MonitorInfo\u PRIMARY。

不幸的是,你所要求的并不像听起来那么简单。无法区分外部插入式显示器和本机设备屏幕:

  • MONITORINFOF_PRIMARY
    将为配置为主监视器的任何监视器设置标志,并且可以是任何外部监视器

  • GetSystemMetrics(SM\u CMONITORS)
    将返回物理监视器的数量,并且对盖子打开或关闭状态没有影响

尽管如此,我一直在使用下面的代码,这些代码可以枚举(在您的例子中可以计算)“可用”的监视器,或者是Windows当前“使用”的监视器。该代码应适用于通过关闭设备盖关闭屏幕的情况

不过,它有一个警告——它只能从交互式用户会话运行。换句话说,您不能从服务应用程序调用它

int CountUsableMonitors()
{
    int count = 0;
    for(int i = 0; ; i++)
    {
        DISPLAY_DEVICE dd = {0};
        dd.cb = sizeof(dd);

        //Get display adapter info
        if(!::EnumDisplayDevices(NULL, i, &dd, 0))
        {
            break;
        }

        //Only if active
        if(dd.StateFlags & DISPLAY_DEVICE_ACTIVE)
        {
            DISPLAY_DEVICE dd2 = {0};
            dd2.cb = sizeof(dd2);

            //Get monitor info
            if(::EnumDisplayDevices(dd.DeviceName, 0, &dd2, 0))
            {
                if(dd2.StateFlags & (DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED))
                {
                    count++;
                }
            }
        }

    }

    return count;
}

不幸的是,你所要求的并不像听起来那么简单。无法区分外部插入式显示器和本机设备屏幕:

  • MONITORINFOF_PRIMARY
    将为配置为主监视器的任何监视器设置标志,并且可以是任何外部监视器

  • GetSystemMetrics(SM\u CMONITORS)
    将返回物理监视器的数量,并且对盖子打开或关闭状态没有影响

尽管如此,我一直在使用下面的代码,这些代码可以枚举(在您的例子中可以计算)“可用”的监视器,或者是Windows当前“使用”的监视器。该代码应适用于通过关闭设备盖关闭屏幕的情况

不过,它有一个警告——它只能从交互式用户会话运行。换句话说,您不能从服务应用程序调用它

int CountUsableMonitors()
{
    int count = 0;
    for(int i = 0; ; i++)
    {
        DISPLAY_DEVICE dd = {0};
        dd.cb = sizeof(dd);

        //Get display adapter info
        if(!::EnumDisplayDevices(NULL, i, &dd, 0))
        {
            break;
        }

        //Only if active
        if(dd.StateFlags & DISPLAY_DEVICE_ACTIVE)
        {
            DISPLAY_DEVICE dd2 = {0};
            dd2.cb = sizeof(dd2);

            //Get monitor info
            if(::EnumDisplayDevices(dd.DeviceName, 0, &dd2, 0))
            {
                if(dd2.StateFlags & (DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED))
                {
                    count++;
                }
            }
        }

    }

    return count;
}

不幸的是,你所要求的并不像听起来那么简单。无法区分外部插入式显示器和本机设备屏幕:

  • MONITORINFOF_PRIMARY
    将为配置为主监视器的任何监视器设置标志,并且可以是任何外部监视器

  • GetSystemMetrics(SM\u CMONITORS)
    将返回物理监视器的数量,并且对盖子打开或关闭状态没有影响

尽管如此,我一直在使用下面的代码,这些代码可以枚举(在您的例子中可以计算)“可用”的监视器,或者是Windows当前“使用”的监视器。该代码应适用于通过关闭设备盖关闭屏幕的情况

不过,它有一个警告——它只能从交互式用户会话运行。换句话说,您不能从服务应用程序调用它

int CountUsableMonitors()
{
    int count = 0;
    for(int i = 0; ; i++)
    {
        DISPLAY_DEVICE dd = {0};
        dd.cb = sizeof(dd);

        //Get display adapter info
        if(!::EnumDisplayDevices(NULL, i, &dd, 0))
        {
            break;
        }

        //Only if active
        if(dd.StateFlags & DISPLAY_DEVICE_ACTIVE)
        {
            DISPLAY_DEVICE dd2 = {0};
            dd2.cb = sizeof(dd2);

            //Get monitor info
            if(::EnumDisplayDevices(dd.DeviceName, 0, &dd2, 0))
            {
                if(dd2.StateFlags & (DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED))
                {
                    count++;
                }
            }
        }

    }

    return count;
}

不幸的是,你所要求的并不像听起来那么简单。无法区分外部插入式显示器和本机设备屏幕:

  • MONITORINFOF_PRIMARY
    将为配置为主监视器的任何监视器设置标志,并且可以是任何外部监视器

  • GetSystemMetrics(SM\u CMONITORS)
    将返回物理监视器的数量,并且对盖子打开或关闭状态没有影响

尽管如此,我一直在使用下面的代码,这些代码可以枚举(在您的例子中可以计算)“可用”的监视器,或者是Windows当前“使用”的监视器。该代码应适用于通过关闭设备盖关闭屏幕的情况

不过,它有一个警告——它只能从交互式用户会话运行。换句话说,您不能从服务应用程序调用它

int CountUsableMonitors()
{
    int count = 0;
    for(int i = 0; ; i++)
    {
        DISPLAY_DEVICE dd = {0};
        dd.cb = sizeof(dd);

        //Get display adapter info
        if(!::EnumDisplayDevices(NULL, i, &dd, 0))
        {
            break;
        }

        //Only if active
        if(dd.StateFlags & DISPLAY_DEVICE_ACTIVE)
        {
            DISPLAY_DEVICE dd2 = {0};
            dd2.cb = sizeof(dd2);

            //Get monitor info
            if(::EnumDisplayDevices(dd.DeviceName, 0, &dd2, 0))
            {
                if(dd2.StateFlags & (DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED))
                {
                    count++;
                }
            }
        }

    }

    return count;
}

你可以,但你可能不应该t@VladLazarenko也许你应该试着解释为什么…你可以,但你可能不应该t@VladLazarenko也许你应该试着解释为什么…你可以,但你可能不应该t@VladLazarenko也许你应该试着解释为什么…你可以,但你可能不应该t@VladLazarenko也许你应该试着解释为什么…谢谢。有没有办法判断某个特定的监视器是开着还是关着?如果您想查看主(笔记本)监视器是否开着,您应该能够枚举监视器并检查上面提到的主标志。yo