2

我使用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;
}

提前致谢!

4

2 回答 2

2

以下来源

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

  • 您也可以尝试在注册表中查找显示监视器。

    显示监视器应存放在这里:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY

    显示监视器的类 GUID 是{4D36E96E-E325-11CE-BFC1-08002BE10318}. 您可以尝试使用 Setup API ( SetupDiGetClassDevs, ...)在系统中查找监视器

  • 如果您是专门为 Win7 及更高版本编写代码,您可能需要查看 QueryDisplayConfig 和相关函数。


来源

于 2012-07-19T11:11:21.180 回答
1

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

于 2012-07-31T09:05:03.883 回答