Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];
ВнизEDID. Получить ID монитора (Работа с байтами) Найти похожие ветки
← →
K-1000 © (2015-10-26 00:33) [0]Нужно получить ID монитора из реестра. (EDID)
В спеке написано, что данные лежат в 8-9 байте:
https://en.wikipedia.org/wiki/Extended_Display_Identification_Data
Получил бинарные данные. Объединяю их в word.
var
A: word;
begin
Name:= MAKEWORD(EDID[8], EDID[9]);
end;
И теперь не знаю как получить из битов нужный ID:
Manufacturer ID. These IDs are assigned by Microsoft, they are PNP IDs "00001=A”; “00010=B”; ... “11010=Z”. Bit 7 (at address 08h) is 0, the first character (letter) is located at bits 6 → 2 (at address 08h), the second character (letter) is located at bits 1 & 0 (at address 08h) and bits 7 → 5 (at address 09h), and the third character (letter) is located at bits 4 → 0 (at address 09h).
Bit 15 (Reserved, always 0)
Bits 14–10 First letter of manufacturer ID (byte 8, bits 6–2)
Bits 9–5 Second letter of manufacturer ID (byte 8, bit 1 through byte 9 bit 5)
Bits 4–0 Third letter of manufacturer ID (byte 9 bits 4–0)
Объясните пожалуйста как это сделать.
← →
K-1000 © (2015-10-26 00:33) [1]*Работа с битами.
← →
Andy BitOff © (2015-10-26 01:04) [2]http://rlu.ru/qEEi
Если нет желания учить булеву алгебру, то
var
a: TBits;
begin
a := TBits.Create;
a.Size := 9;
if not a.Bits[0] then
a.Bits[7] := true;
a.Bits[1] := not a.Bits[2];
← →
K-1000 © (2015-10-26 01:10) [3]Я знаю как установить бит, проверить установлен ли он и т.д.
Не ясно, что написано в спецификации.
← →
Andy BitOff © (2015-10-26 01:46) [4]А-а, ну тады я тебя не понял.
← →
Pavia © (2015-10-26 06:29) [5]Там ID состоит как бы из двух половинок.Буков и цифр. Которые проще декодировать по разному.
Memo1.Lines.Add("EDID Cheack Sum OK");
id:=buf[9]+buf[8] shl 8;
s:=" "+InttoHex((Word(BUF[10])+BUF[11] shl 8),4);
s[3]:=Char(id and 31+$40);
s[2]:=Char(id shr 5 and 31+$40);
s[1]:=Char(id shr 10 and 31+$40);
Memo1.Lines.Add("Monitir ID: "+s);
Memo1.Lines.Add(Format("Sireal: %x",[BUF[12]]));
← →
Pavia © (2015-10-26 06:30) [6]PS. Код рабочий проверенный, но писал лет 5 назад поэтому что к чему плохо помню.
← →
Игорь Шевченко © (2015-10-26 10:16) [7]
> Memo1.Lines.Add("EDID Cheack Sum OK");
> Memo1.Lines.Add("Monitir ID: "+s);
> Memo1.Lines.Add(Format("Sireal: %x",[BUF[12]]));
То есть, у тебя с любым языком беда...
← →
K-1000 © (2015-10-26 12:13) [8]
> Pavia © (26.10.15 06:29) [5]
>
> Там ID состоит как бы из двух половинок.Буков и цифр. Которые
> проще декодировать по разному.
>
Работает. Почитал я спеку и похоже нужного мне не найти.
"Manufacturer ID" оказывается не то. Он уже у меня есть без EDID.
Нужно получить имя монитора.
Одна прога, читающая EDID его выводит, хотя в спеке найти не могу подобное.
← →
K-1000 © (2015-10-26 12:13) [9]Может это программа и не из EDID его достаёт.
← →
Andy BitOff © (2015-10-26 12:56) [10]Посмотри на torry был исходничек Monitorinfo по-моему. Можкт поможет чем.
← →
Pavia © (2015-10-26 14:09) [11]Моя из EDID берёт Monitor Name смотри ветку case $FC.
function GetStr0A(p:Pchar):String;
var i:integer;
s:String;
begin
i:=0;
s:="";
while p[i]<>#10 do
begin
s:=s+p[i];
inc(i);
end;
GetStr0A:=s;
end;
...
begin
...
for i:=0 to 3 do
begin
case buf[54+i*18+3] of
$FF: Memo1.Lines.Add("Serial Number: "+GetStr0A(@buf[54+i*18+5]));
$FE: Memo1.Lines.Add("ASCII String: "+ GetStr0A(@buf[54+i*18+5]));
...
$FC: Memo1.Lines.Add("Monitor Name: "+ GetStr0A(@buf[54+i*18+5]));
...
else
...
end; // case
end; // for
← →
Кто б сомневался © (2015-10-26 14:19) [12]Кстати, а кто нибудь в курсе, есть ли какой нибудь универсальный Display API, чтобы к примеру яркость монитора поменять программно.
← →
K-1000 © (2015-10-26 14:44) [13]
> Andy BitOff © (26.10.15 12:56) [10]
>
> Посмотри на torry был исходничек Monitorinfo по-моему. Можкт
> поможет чем.
> Pavia © (26.10.15 14:09) [11]
>
> Моя из EDID берёт Monitor Name смотри ветку case $FC.
То что нужно, спасиб. :)
← →
Pavia © (2015-10-26 16:48) [14]
> есть ли какой нибудь универсальный Display API, чтобы к
> примеру яркость монитора поменять программно.
Нету. Можно к примеру через:
https://msdn.microsoft.com/en-us/library/dd692972(v=vs.85).aspx
Но по факту обычно эта функция виртуальная и делается средствами видео карты, а не монитора. А так обратный канал и протокол для управления монитором есть, вопрос в том что разработчики видеокарт не делают API на доступ.
← →
Кто б сомневался © (2015-10-26 21:23) [15]
> Но по факту обычно эта функция виртуальная и делается средствами
> видео карты
Виртуальная - это всмысле делать картинку изображения на мониторе ярче\слабее, но яркость и контраст самого монитора не меняется?
А протокол там стандартный, или у каждого монитора (компании) свой?
Может самому можно разобраться? Есть какие то ключевые слова для поиска?
Странно что таких программ нету, они бы очень пригодились.
← →
K-1000 © (2015-10-27 10:14) [16]
> Кто б сомневался © (26.10.15 21:23) [15]
Можно ещё посмотреть функции:
SetDeviceGammaRamp() и ChangeDisplaySettingsEx() с флагом CDS_VIDEOPARAMETERS.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c