小编Lea*_*iam的帖子

EnumDisplayDevices功能对我不起作用

我试图以编程方式获取我的显示器上的信息.循环的内容现在并不重要,它们只包含将在满足循环条件时打印的调试语句.现在,外循环代码执行三次并且永远不会访问内循环代码,这意味着(内部)循环的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)

c++ winapi msdn qt windows-7

5
推荐指数
1
解决办法
8388
查看次数

Windows如何分配显示设备名称?(例如\\.\ DISPLAY1)并确定显示端口?

我们正在编写一个程序,必须能够将设置推送到特定的监视器,要求我们为每个显示设备提供唯一的标识符.到目前为止,我能得到的最好的方法是查询EnumDisplayDevices返回的DEVMODE结构的句柄,看看返回的DISPLAY_DEVICE名称是否包含"DISPLAY1"或"DISPLAY2"(我们最多只支持使用此软件的两个监视器,以及deviceName DISPLAY_DEVICE结构的字段形式为\.\ DISPLAYx,其中x是自然数,最小值为1).

我的问题是,如果有人将设置从一个终端应用到另一个终端并且实际上说"从DISPLAY1获取我的所有设置以及我的DISPLAY2中的所有设置并将它们应用到另一个终端的DISPLAY1和DISPLAY2",它是否会应用设置连接到相应端口的显示器?据我所知,如果只连接了1台显示器,则该显示器的名称为\.\ DISPLAY1,如果有两台连接,则通过DVI连接的显示设备为\.\ DISPLAY1,VGA上的设备为\.\ DISPLAY2.

我已经尝试一次拔掉一个显示器,以不同的顺序重新连接它们,重新启动,只用一个连接重启,然后再连接一个等等,它似乎总是以这种方式分配它们.我似乎无法将它们分配给相反的名字.如果是这种情况,那么我们应该没问题.

或者,如果有人知道使用MSDN调用以编程方式确定监视器连接到哪个端口(DVI或VGA等)的方法,那将更有帮助.基本上我已经用尽了解决这个问题的所有选择.

基本上,我问,我是否正确地假设Windows 7如何为显示器分配名称?如果没有,它是如何完成的?有没有办法改变它?如果是这样,怎么样?有没有办法确定监视器连接的端口?

顺便说一句,这个应用程序是用C++编写的,如果这很重要的话.

谢谢.

-Alex aka LeapDayWilliam

windows winapi msdn windows-7

5
推荐指数
1
解决办法
3993
查看次数

标签 统计

msdn ×2

winapi ×2

windows-7 ×2

c++ ×1

qt ×1

windows ×1