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