无论会话如何获取显示设备信息?

时间:2012-07-19 06:24:45

标签: c++ winapi

我使用EnumDisplayDevices来获取有关当前会话中显示设备的信息。

但是无论会话如何,我都需要有关显示设备的信息。因为我创建了一些Windows服务应用程序(系统进程)。

是否有人知道此代码的替代方法:

vncDesktop::GetNrMonitors()
{
    if(OSversion()==3 || OSversion()==5) return 1;
    int i;
    int j=0;

    helper::DynamicFn<pEnumDisplayDevices> pd("USER32","EnumDisplayDevicesA"); // it's EnumDisplayDevices function

    if (pd.isValid())
    {
        DISPLAY_DEVICE dd;
        ZeroMemory(&dd, sizeof(dd));
        dd.cb = sizeof(dd);
        for (i=0; (*pd)(NULL, i, &dd, 0); i++)
            {
                if (dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)
                    if (!(dd.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))j++;
            }
    }
    return j;
}

提前致谢!

2 个答案:

答案 0 :(得分:2)

以下来源

嗯,这不起作用的原因是因为会话0没有连接到控制台。更重要的是,因为在Windows 7上每个用户有更多的视频设置,所以假设从一个用户获得的任何东西甚至适用于另一个用户是不好的。

  • 您还可以尝试在注册表中找到显示器。

    显示器监视器应存放在此处:

    HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \枚举\ DISPLAY

    显示监视器的类GUID为{4D36E96E-E325-11CE-BFC1-08002BE10318}。您可以尝试使用Setup API(SetupDiGetClassDevs,...)

  • 在系统中查找监视器
  • 如果您专门为Win7及更高版本编码,您可能需要查看QueryDisplayConfig及相关功能。


来源

答案 1 :(得分:1)

我找到了解决这个问题的方法。只需要创建进程用户 - 系统和SessionID - 一些用户。然后一切正常。