【问题标题】:How to obtain display devices information regardless of session?如何在不考虑会话的情况下获取显示设备信息?
【发布时间】:2012-07-19 06:24:44
【问题描述】:

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

提前致谢!

【问题讨论】:

  • 我有点怀疑。服务为什么要关心?它没有做任何 UI,是吗?
  • 我在 vnc 服务器上使用这个服务。
  • 设置标志以允许桌面交互应该可以解决这个问题。
  • 该标志最后一次起作用是在 10 年前,在 Windows XP 中。 Windows 服务不显示用户界面,也不允许以任何方式与用户交互。他们甚至无法假设用户会登录——服务一直在后台运行,甚至从登录屏幕开始。

标签: c++ winapi


【解决方案1】:

以下来源

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

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

    显示器应该存放在这里:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY

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

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


来源

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多