- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试以编程方式获取有关我的显示器的信息。循环的内容现在并不重要,它们只包含在满足循环条件时将打印的调试语句。现在,外循环代码执行了 3 次,而内循环代码从未被访问过,这意味着(内)循环的 while 条件永远不会为真,这意味着调用失败。
我的问题是 Windows API 说,关于这个函数:
To obtain information on a display monitor, first call EnumDisplayDevices with lpDevice >set to NULL. Then call EnumDisplayDevices with lpDevice set to DISPLAY_DEVICE.DeviceName >from the first call to EnumDisplayDevices and with iDevNum set to zero. Then >DISPLAY_DEVICE.DeviceString is the monitor name.
...但是即使完全按照它说的去做,第二个 EnumDisplayDevices 调用总是失败?有什么见解吗???
此外,我在 windows xp 和 windows 7 上都将其作为服务级别应用程序执行此操作,并获得了相同的结果。当我尝试打印出 dd.DeviceName 时,它给了我一个地址(例如:0x12cfa4),但这必须是函数在第二次调用时所期望的,因为 MSDN 说只需传入显示设备指针并将 .DeviceName 附加到它...
使用 C++(使用 Qt)、Windows API/MSDN 调用。
DISPLAY_DEVICE dd;
dd.cb = sizeof(DISPLAY_DEVICE);
DWORD deviceNum = 0;
while( EnumDisplayDevices(NULL, deviceNum, &dd, 0) ){
qWarning() << "We've entered the outer loop.";
while( EnumDisplayDevices(dd.DeviceName, 0, &dd, 0)){
qWarning() << "We've entered the inner loop.";
}
deviceNum++;
}
最佳答案
问题是将“dd”传递到内部调用,同时使用“dd”的成员作为输入字符串。我知道这没有意义,但我怀疑因为 dd 是一个 out 参数,API 正在写入它,但是在它被涂上之后查看输入参数的内容。如果他们为了理智而在执行之前将输出参数 memset 设置为 0,则可能会发生这种情况。
只需确保它不是关于发送非空 dd 的问题,我制作了第二个 dd,其中包含完全相同的位,并且一切仍然正常。这肯定是别名内存。
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "user32.lib")
void DumpDevice(const DISPLAY_DEVICE& dd, size_t nSpaceCount )
{
printf("%*sDevice Name: %s\n", nSpaceCount, "", dd.DeviceName );
printf("%*sDevice String: %s\n", nSpaceCount, "", dd.DeviceString );
printf("%*sState Flags: %x\n", nSpaceCount, "", dd.StateFlags );
printf("%*sDeviceID: %s\n", nSpaceCount, "", dd.DeviceID );
printf("%*sDeviceKey: ...%s\n\n", nSpaceCount, "", dd.DeviceKey+42 );
}
int main()
{
DISPLAY_DEVICE dd;
dd.cb = sizeof(DISPLAY_DEVICE);
DWORD deviceNum = 0;
while( EnumDisplayDevices(NULL, deviceNum, &dd, 0) ){
DumpDevice( dd, 0 );
DISPLAY_DEVICE newdd = {0};
newdd.cb = sizeof(DISPLAY_DEVICE);
DWORD monitorNum = 0;
while ( EnumDisplayDevices(dd.DeviceName, monitorNum, &newdd, 0))
{
DumpDevice( newdd, 4 );
monitorNum++;
}
puts("");
deviceNum++;
}
return 0;
}
我现在所在的盒子只有 1 个监视器,所以我无法验证内部循环,但我怀疑它没问题,因为“newdd”永远不会在调用中使用别名。您还说您处于服务环境中 - 我不确定 winstation 是否会限制您对显示器的看法 - 所以这也可能是一个问题;但我怀疑您至少应该仍然能够看到物理设备。在我的机器上,我得到:
Device Name: \\.\DISPLAY1
Device String: NVIDIA GeForce GTX 580
State Flags: 8000005
DeviceID: PCI\VEN_10DE&DEV_1080&SUBSYS_15803842&REV_A1
DeviceKey: ...\Control\Video\{B0CDD262-FCFB-4FD4-A03C-54621896C9CD}\0000
Device Name: \\.\DISPLAY1\Monitor0
Device String: Generic PnP Monitor
State Flags: 3
DeviceID: MONITOR\DEL4016\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002
DeviceKey: ...\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002
Device Name: \\.\DISPLAY2
Device String: NVIDIA GeForce GTX 580
State Flags: 0
DeviceID: PCI\VEN_10DE&DEV_1080&SUBSYS_15803842&REV_A1
DeviceKey: ...\Control\Video\{B0CDD262-FCFB-4FD4-A03C-54621896C9CD}\0001
Device Name: \\.\DISPLAYV1
Device String: RDPDD Chained DD
State Flags: 8
DeviceID:
DeviceKey: ...\Control\Video\{DEB039CC-B704-4F53-B43E-9DD4432FA2E9}\0000
Device Name: \\.\DISPLAYV2
Device String: RDP Encoder Mirror Driver
State Flags: 200008
DeviceID:
DeviceKey: ...\Control\Video\{42cf9257-1d96-4c9d-87f3-0d8e74595f78}\0000
Device Name: \\.\DISPLAYV3
Device String: RDP Reflector Display Driver
State Flags: 200008
DeviceID:
DeviceKey: ...\Control\Video\{b043b95c-5670-4f10-b934-8ed0c8eb59a8}\0000
关于c++ - EnumDisplayDevices 函数对我不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9524309/
我在使用 C# 中的 EnumDisplayDevices 时遇到问题。我使用了发布的代码 here它工作得天衣无缝。但是最近我转而在台式计算机上编写应用程序。代码不再有效,没有给我任何东西。 如果有
我正在尝试以编程方式获取有关我的显示器的信息。循环的内容现在并不重要,它们只包含在满足循环条件时将打印的调试语句。现在,外循环代码执行了 3 次,而内循环代码从未被访问过,这意味着(内)循环的 whi
我正在尝试枚举多显示器系统上连接的所有显示器的详细信息。所以我引用了this示例代码。完整代码供引用: #include #include #pragma comment(lib, "user32
我正在使用 Python 制作 Night Light 应用程序。我正在使用 Windows API 来使用 Gamma Ramp 来完成我的任务。我使用 user32.dll 中的 EnumDisp
目前我有一个函数,我希望它返回事件监视器的数量(通过使用 EnumDisplayDevices)。 ... DISPLAY_DEVICE dd; dd.cb = sizeof(DISP
我需要为客户部署一个硬盘镜像,该镜像在第一次启动时检测显卡类型并安装适当的驱动程序。因此,就代码而言,这意味着我需要在不使用 GPU 特定库(如 NvAPI 或 AMD SDK)的情况下使用 C++
我遇到了 this有人想使用 EnumDisplayDevices 找出他们的显示器名称的帖子。 这正是我想要的,我尝试在 C++ 中做一些类似的事情,但对 EnumDisplayDevices 的第
对于我当前的 C++ 项目,我需要为在大量计算机上连接并处于事件状态的每个监视器检测一个唯一的字符串。 研究指出了两种选择 使用 WMI 并查询 Win32_DesktopMonitor 以获取所有事
我正在尝试从 user32 获取我的监视器的名称。到目前为止,我所得到的都是汉字。我不确定为什么,我们将不胜感激。 public static SafeNativeMethods.DISPLA
我是一名优秀的程序员,十分优秀!