标签: edid

如何在 OSX 中获取显示器 EDID?

我想在 OSX 中提取 EDID 信息?

看起来它存储在IORegistry. 有没有办法使用当前的monomac库访问它?我可以用标准interop来做还是我需要写一个自定义shim

看起来ioreg命令行也可以获取IODisplayEDID 属性,但似乎没有一种简单的方法来获取设备的缩写列表。

pinvoke iokit edid xamarin xamarin.mac

9
推荐指数
2
解决办法
8855
查看次数

识别显示设备的可靠方法?

我一直在研究识别显示设备(在我的情况下是telivisions)的解决方案,以保持主要布局,特别设计为使用多显示器.

假设我连接了6台电视机.(通常其中3个通过HDMI端口,其他3个通过DVI端口(使用DVI到HDMI适配器)),它们的物理位置是3x2,如下所示:

TV1 ... TV2 ... TV3

TV4 ... TV5 ... TV6

目标

我想在每个特定的电视上显示一些全屏内容.Content1必须转到TV1,Content2必须转到TV2等...换句话说:我需要将我的内容推送到DisplayDevice(电视) - 而不是任何位置或屏幕,因为它们可能因Windows行为而改变.(见下文)

您可能知道,Windows不会按照您连接它们的顺序枚举显示设备(或者实际上根本不基于任何规则?).它使用完全不同的方式枚举显示,例如:

\.\ DISPLAY3 ... \.\ DISPLAY6 ... \.\ DISPLAY1

\.\ DISPLAY4 ... \.\ DISPLAY2 ... \.\ DISPLAY5

我做了什么来解决这个问题,当我完成连接所有电视以匹配他们的真实位置时,我手动在显示设置中订购电视.

问题

但有SA问题就在这里:一些电视模型只是假装喜欢他们已经被拔掉时,他们关闭(或设置为待机模式),并且会导致Windows 下降显示设备从系统和重新枚举的再次显示设备.

由于这种行为(某些电视模型和Windows本身),我不能指望Screen.DisplayName属性甚至Screen.Location,因为它们是变量.它们都在重新枚举过程后立即改变.

到目前为止我尝试过的解决方案

我试图获取所有显示设备的序列号,认为我可以找到一种方法将这些数字与Screen.DisplayName相关联.好吧,我实际上通过使用SetupAPI的EnumDisplayDevices来管理那里,但是在我意识到大多数电视没有有效的SerialNumber后,这一切都变成了垃圾.即便是三星电视也没有Seri​​alNumber(但三星显示器肯定没有 - 所以我猜这是关于"显示器"和"电视"之间的区别)

毕竟..

我仍在寻找解决这个问题的方法.我想到的另一个想法是,也许我应该停止尝试将内容推送到显示设备(因为它们无法识别)也许我应该尝试将内容推送到显卡的端口,这意味着我必须确定哪些端口图形卡的关联与哪个显示设备(屏幕)有关,但我都在谈论它而不知道它 - 甚至不知道这样的事情是否可能.

我正在寻找你的建议,谢谢你们.

.net c# windows multiple-monitors edid

7
推荐指数
1
解决办法
690
查看次数

寻找Forms.Screen.DeviceName到Monitor EDID信息的可靠映射

我正在开发一个应用程序,它将在相应监视器上的对话框上显示从EDID块(监视器型号,ID,S/N等)派生的信息.

此代码适用于查找显示的EDID信息.它通过枚举HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY\[Monitor]\[PnPID]\Device Parameters\EDID下的DISPLAY键来提取EDID信息.

更新:上面的代码依赖于PnP使用注册表的"副作用".我现在使用SetupAPI枚举监视器,它正确处理连接/删除的监视器(与上面链接中的代码不同).

我试图将Windows.Forms.Screen.AllScreens [](\\.\ DISPLAY1,\\.\ DISPLAY2等)中的每个屏幕与上述注册表检查返回的条目相关联.

注意:在下面的代码块中,DisplayDetails.GetMonitorDetails()现已使用SetupAPI替换为更强大的注册表枚举代码,但返回的数据是相同的.

例如

private void Form1_Load(object sender, EventArgs e)
{
    Console.WriteLine("Polling displays on {0}:", System.Environment.MachineName);
    int i = 0;
    foreach ( DisplayDetails dd in DisplayDetails.GetMonitorDetails())
    {
        Console.WriteLine( "Info: Model: {0}, MonitorID: {1}, PnPID: {2}, Serial#:{3}", dd.Model, dd.MonitorID, dd.PnPID, dd.SerialNumber );
        Console.WriteLine( "Does this correlate to Screen: {0}?", Screen.AllScreens[i++].DeviceName );
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

信息:型号:DELL P2411H,MonitorID:DELA06E,PnPID:5&2e2fefea&0&UID1078018,Serial#:F8NDP0C ... PU

这是否与Screen相关:\\.\ DISPLAY1?

信息:型号:DELL P2411H,MonitorID:DELA06E,PnPID:5&2e2fefea&0&UID1078019,Serial#:F8NDP0C ... AU

这与Screen相关:\\.\ DISPLAY2?


答:没有

在测试中,我发现它们没有可靠的关联(我有一个系统,其中枚举的第一个显示是\\.\ DISPLAY2). …

windows winapi monitor winforms edid

6
推荐指数
1
解决办法
3947
查看次数

获取HDMI EDID数据

我正在开发一个应用程序,它使用MHL适配器反映任何连接的HDMI监视器.问题是我需要获得制造商,序列号,分辨率,屏幕尺寸等监视器数据,如果它真的显示我的内容或它只是在另一个HDMI输入.

android edid hdmi

5
推荐指数
0
解决办法
900
查看次数

如何从EDID中读取显示器的型号?

在注册表中,有一个(或多个)键,具体取决于您拥有多少台显示器HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY \ DEL404C {Some Unique ID} \ Device Parameters \ EDID,它是REG_BINARY键。就我而言,这是:

00 ff ff ff ff ff ff 00 4c 2d 6f 03 39 31 59 4d 
07 12 01 03 0e 29 1a 78 2a 80 c5 a6 57 49 9b 23 
12 50 54 bf ef 80 95 00 95 0f 81 80 81 40 71 4f 
01 01 01 01 01 01 9a 29 a0 d0 51 84 22 …
Run Code Online (Sandbox Code Playgroud)

c++ edid

2
推荐指数
1
解决办法
2789
查看次数