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

Lea*_*iam 5 windows winapi msdn windows-7

我们正在编写一个程序,必须能够将设置推送到特定的监视器,要求我们为每个显示设备提供唯一的标识符.到目前为止,我能得到的最好的方法是查询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

小智 1

我认为您正在寻找一些代码来帮助您将监视器的规范名称与其物理位置相关联。您正在寻找一种解决方案,可以通过查看显示器的设备名称来做出此决定,但这不是准确或可靠的方法。根据我的经验,监视器设备名称的编号方案没有任何押韵或理由。您真正需要的是一种方法来确定哪个显示器的物理位置。

下面是一些非常基本的代码,用于打印您感兴趣的显示器的虚拟像素位置的 X、Y 坐标。您会注意到,如果您有两个(或更多)显示器,这些显示器的 X 值将会增加基于显示器左侧的宽度。您可以根据此信息计算监视器的物理位置。

    BOOL CALLBACK enumMonitorCallback(
  __in  HMONITOR hMonitor,
  __in  HDC hdcMonitor,
  __in  LPRECT lprcMonitor,
  __in  LPARAM dwData
)
{
    printf("Monitor: %p (X,Y): (%d,%d) (Width, Height): (%d,%d) \n", hMonitor, lprcMonitor->left, lprcMonitor->top, lprcMonitor->right - lprcMonitor->left, lprcMonitor->bottom - lprcMonitor->top);
    return TRUE;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;
    BOOL res = EnumDisplayMonitors(NULL, NULL, enumMonitorCallback, NULL);
    getchar();
    return nRetCode;
}
Run Code Online (Sandbox Code Playgroud)

我的机器有两个显示器。我得到这个输出:

    Monitor: 0x00C005E1 (X,Y): (0,0) (Width, Height): (1280,1024)
    Monitor: 0x00020001 (X,Y): (1280,0) (Width, Height): (1280,1024)
Run Code Online (Sandbox Code Playgroud)

这告诉我句柄为 0x00020001 的监视器位于第一个监视器的右侧,并按该监视器的分辨率 (1280px) 进行偏移。

我希望这有帮助。