Lea*_*iam 5 c++ winapi msdn qt windows-7
我试图以编程方式获取我的显示器上的信息.循环的内容现在并不重要,它们只包含将在满足循环条件时打印的调试语句.现在,外循环代码执行三次并且永远不会访问内循环代码,这意味着(内部)循环的while条件永远不会为真,这意味着调用失败.
我的问题是Windows API说,关于这个功能:
要在显示监视器上获取信息,首先调用EnumDisplayDevices,并将lpDevice>设置为NULL.然后调用EnumDisplayDevices,将lpDevice设置为DISPLAY_DEVICE.DeviceName>,从第一次调用到EnumDisplayDevices并将iDevNum设置为零.然后> DISPLAY_DEVICE.DeviceString是监视器名称.
...但即使完全按照它所说的那样,第二次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++;
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*Joe 11
问题是在使用'dd'的成员作为输入字符串时将'dd'传递给内部调用.我知道这没有意义,但我怀疑,因为dd是一个out参数,API正在写入它,但后来在它上面写了输入参数的内容.如果他们在执行完整性之前做了类似memset将输出parm设置为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;
}
Run Code Online (Sandbox Code Playgroud)
我在这个盒子,现在只有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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8388 次 |
| 最近记录: |