Re: AHK: Управление монитором, DDC/CI
Если б вы знали глубину моего непонимания вашего ответа...
NumPut(OR 1., DISPLAYCONFIG_TARGET_DEVICE_NAME, 20, "uint")
Так?
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Нет, я имел в виду, что сначала формируете этот UINT32, а потом его и пишете. Если там только первый бит и больше ничего, то просто пишите 1 как "uint". А если там ещё что-то и надо просто добавить первый бит, то
number := number | 1
; или можно сокращённо (если я ничего не путаю)
number |= 1
; потом уже
NumPut(number, DISPLAYCONFIG_TARGET_DEVICE_NAME, 20, "uint")
Только точно ли там смещение 20?
Re: AHK: Управление монитором, DDC/CI
Так number чему равен, 0xffffffff?
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Если там только первый бит и больше ничего, то просто пишите 1 как "uint"
Первый бит в "BYTE" это 128, почему не один тогда:
MsgBox % 0xff >> 1
MsgBox % ToBin(128)
ToBin(Number)
{
while n := Number >> (A_Index - 1)
bin := n & 1 . bin
return Format("{:08}", bin)
}
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Нет, первый (точнее, нулевой) — это самый младший бит. Иначе получится ерунда: в байте он первый, а в слове (два байта) уже девятый будет? Считают биты с конца.
Re: AHK: Управление монитором, DDC/CI
Ок, для закрепления, как установить 2 и 4 бит = 1 в UINT32?
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
На самом деле это будут первый и третий (считаем с нуля), так что получаем 2 в степени 1 и 2 в степени 3, т.е. 2 и 8. Вот эти числа и нужно поместить в UINT32.
Т.е. битам соответствуют степени двойки. В байте, например, это 1, 2, 4, 8, 16, 32, 64, 128.
Re: AHK: Управление монитором, DDC/CI
number |= 10 ; 2 + 8
110 2019-01-15 23:44:07 (изменено: serzh82saratov, 2019-01-15 23:44:42)
Re: AHK: Управление монитором, DDC/CI
Иначе получится ерунда: в байте он первый, а в слове (два байта) уже девятый будет?
Ну если считать слева направо, то также и останется первым.
В общем считать надо справа налево.
(считаем с нуля)
Почему тогда пишут первый а не нулевой?
Setting this member is equivalent to setting the first bit of the 32-bit value member
И чем удобнее с нуля, если в байте 8 бит, а старший называется "седьмым".
Или это принято чтобы не путаться в такой записи, а нулевая степень всегда равно 1.
Number |= (1<<1) | (1<<3)
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Только точно ли там смещение 20?
Я посчитал это как 20 байт, а тот параметр идёт следующим.
typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER {
DISPLAYCONFIG_DEVICE_INFO_TYPE type;
UINT32 size;
LUID adapterId;
UINT32 id;
} DISPLAYCONFIG_DEVICE_INFO_HEADER;
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Почему тогда пишут первый а не нулевой?
Привыкли люди с 1 считать. С нулевым бы проблемы не было, конечно, а вот следующие куча народу по привычке поняла бы неправильно. Думаю, поэтому.
С нуля удобнее, если надо сообразить, какой бит какому числу соответствует.
Я посчитал это как 20 байт
А почему 20? Надо, наверно, в Visual C++ проверить, это проще всего.
Re: AHK: Управление монитором, DDC/CI
Надо, наверно, в Visual C++ проверить, это проще всего.
До этого ещё мой прогресс не дошёл. (
Win10x64 AhkSpy, Hotkey, ClockGui
114 2019-01-16 00:16:17 (изменено: serzh82saratov, 2019-01-16 00:16:48)
Re: AHK: Управление монитором, DDC/CI
typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER {
DISPLAYCONFIG_DEVICE_INFO_TYPE type; = 4
UINT32 size; = 4
LUID adapterId; = 8
UINT32 id; = 4
} DISPLAYCONFIG_DEVICE_INFO_HEADER;
На счёт DISPLAYCONFIG_DEVICE_INFO_TYPE есть сомнения.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Нет, действительно 20 показывает команда sizeof. А DISPLAYCONFIG_TARGET_DEVICE_NAME — 420.
Re: AHK: Управление монитором, DDC/CI
Ну да 420, считал так, значит правильно понял, но циферки невнимательно сложил.
typedef struct DISPLAYCONFIG_TARGET_DEVICE_NAME {
DISPLAYCONFIG_DEVICE_INFO_HEADER header; 20
DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags; 4
DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; 4
UINT16 edidManufactureId; 2
UINT16 edidProductCodeId; 2
UINT32 connectorInstance; 4
WCHAR monitorFriendlyDeviceName[64]; 128
WCHAR monitorDevicePath[128]; 256
} DISPLAYCONFIG_TARGET_DEVICE_NAME;
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
До этого ещё мой прогресс не дошёл. (
Там много кода не надо. Вот всего лишь.
int main()
{
wcout << sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME) << endl;
system("echo. && pause");
return 0;
}
А если поставить курсор на название типа и нажать F12, откроется его определение в заголовочном файле. Там так же можно открыть определения типов всех членов структуры.
118 2019-01-16 01:37:00 (изменено: serzh82saratov, 2019-01-16 01:44:53)
Re: AHK: Управление монитором, DDC/CI
А в двоичном виде, так выглядит 4х байтовое число?
Number := 0x01020408
MsgBox % ToBin(Number)
Return
ToBin(Number)
{
Loop
{
LowByte := Number & 0xff
bin := ""
While n := LowByte >> (A_Index - 1)
bin := (n & 1) . bin
ret := Format("{:08}", bin) " " ret
If !(Number := Number >> 8)
Break
}
Return ret
}
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Проще так:
Number := 0x01020408
Loop 32
bin := (mod(A_Index, 8) ? "" : " ") . (Number >> (A_Index - 1))&1 . bin
MsgBox, % bin
Re: AHK: Управление монитором, DDC/CI
Спасибо, понял, сейчас как раз разбирал код
Number >> (A_Index - 1))&1
Я просто 4х байтовое число как пример привёл, изначально рассчитывая код на их разное кол-во.
В общем в двоичном виде так и должно выглядеть.
Win10x64 AhkSpy, Hotkey, ClockGui
121 2019-01-16 02:32:03 (изменено: serzh82saratov, 2019-01-16 02:34:08)
Re: AHK: Управление монитором, DDC/CI
Ещё вопрос, я установил 2 бит в 1, как установить его в 0 без ^=, то есть предварительно не проверяя его значение.
Number := 0x01
MsgBox % ToBin(Number)
Number |= (1 << 2)
MsgBox % ToBin(Number)
Number ^= (1 << 2)
MsgBox % ToBin(Number)
Return
ToBin(Number)
{
Loop
{
LowByte := Number & 0xff
bin := ""
While n := LowByte >> (A_Index - 1)
bin := (n & 1) . bin
ret := Format("{:08}", bin) " " ret
If !(Number := Number >> 8)
Break
}
Return ret
}
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
По идее, так:
Number := 0x01
MsgBox % ToBin(Number)
Number |= (1 << 2)
MsgBox % ToBin(Number)
Number &= ~(1 << 2)
MsgBox % ToBin(Number)
Return
ToBin(Number)
{
Loop
{
LowByte := Number & 0xff
bin := ""
While n := LowByte >> (A_Index - 1)
bin := (n & 1) . bin
ret := Format("{:08}", bin) " " ret
If !(Number := Number >> 8)
Break
}
Return ret
}
Re: AHK: Управление монитором, DDC/CI
ToBin ещё так можно:
Number := 2**8
while 1 << ( (i := A_Index - 1) - mod(i, 8) ) <= Number
bin := (mod(i + 1, 8) ? "" : " ") . (Number >> i)&1 . bin
MsgBox, % bin
Re: AHK: Управление монитором, DDC/CI
Или так:
MsgBox % NumberToBinary(5) ;101
MsgBox % NumberToBinary(50) ;110010
MsgBox % NumberToBinary(9000) ;10001100101000
NumberToBinary(InputNumber)
{
While, InputNumber
Result := (InputNumber & 1) . Result, InputNumber >>= 1
Return, Result
}
Re: AHK: Управление монитором, DDC/CI
Так без пробелов через 8 бит.
126 2019-01-17 05:14:05 (изменено: serzh82saratov, 2019-01-17 05:15:30)
Re: AHK: Управление монитором, DDC/CI
Number &= ~(1 << 2)
Побитовые И (&)
Побитовое NOT (~). Инвертирует каждый бит своего операнда. Если операнд - не целое число, перед вычислением оно округляется до целого. Если значение операнда принадлежит диапазону от 0 до 4294967295 (0xffffffff), оно трактуется как беззнаковое 32-битное значение. Иначе значение операнда трактуется как 64-битное значение со знаком. Например, ~0xf0f возвращает 0xfffff0f0 (4294963440).
Не могу из этого сделать выводы, можете своими словами объяснить принцип действия.
teadrinker
Нормально, в один проход.
Malcev
Нагляднее конечно 8 ми значными выводить через разделитель.
После &= ~ моя функция преобразует 5 - 8 байтное в 4 байтное.
Функция teadrinker делает также, но с 8 байтными числами уходит в вечный цикл.
Number := 0xffffffffffffffff
MsgBox % ToBin(Number)
Number |= (1 << 2)
MsgBox % ToBin(Number)
Number &= ~(1 << 2)
MsgBox % ToBin(Number)
Return
Win10x64 AhkSpy, Hotkey, ClockGui
127 2019-01-17 05:17:52 (изменено: serzh82saratov, 2019-01-17 05:18:30)
Re: AHK: Управление монитором, DDC/CI
Так становится в итоге ноль.
Number := 0xff00000000
MsgBox % ToBin(Number)
Number |= (1 << 2)
MsgBox % ToBin(Number)
Number &= ~(1 << 2)
MsgBox % ToBin(Number)
Win10x64 AhkSpy, Hotkey, ClockGui
128 2019-01-17 10:11:59 (изменено: YMP, 2019-01-17 10:12:42)
Re: AHK: Управление монитором, DDC/CI
В этом проблема с отсутствием строгой типизации переменных. С одной стороны проще, а с другой: как дать АНК понять, что результат инверсии должен быть 64-битным? Хрен его знает. Сиди и голову ломай. Может, во второй версии этой проблемы нет.
Не могу из этого сделать выводы, можете своими словами объяснить принцип действия.
При инверсии 1 становится 0, а & с 0 даёт 0 в любом случае. Остальные биты, бывшие 0, становятся 1, а & с 1 даёт 1, если была 1, и 0, если был 0. Т.е. там ничего в Number не изменится. Но т.к. АНК сокращает второй операнд до 32 бит, то выше 32 бит получаются нули, которые обнуляют и верхнюю половину Number.
Re: AHK: Управление монитором, DDC/CI
Ясненько.
Вот всего лишь.
int main() { wcout << sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME) << endl; system("echo. && pause"); return 0; }
Пишет:
идентификатор "DISPLAYCONFIG_TARGET_DEVICE_NAME" не определен
Нужно что то "заинклудить" или как то объявить DISPLAYCONFIG_TARGET_DEVICE_NAME?
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Да, в stdafx.h я добавил
#include <windows.h>
#include <iostream>
А файл .cpp выглядит так:
#include "stdafx.h"
using namespace std;
int main()
{
wcout << sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME) << endl;
system("echo. && pause");
return 0;
}
wcout — это вывод Юникодного текста. Конкретно здесь можно и просто cout, вывод в ANSI.
Re: AHK: Управление монитором, DDC/CI
Если нужен вывод в hex, то можно так:
cout << "0x" << hex << uppercase << sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME) << endl;
Re: AHK: Управление монитором, DDC/CI
YMP
Спасибо за подробный ответ.
stdafx.h не нашёл, просто прописал перед main.
У меня VS х32, это влияет на sizeof? То есть как понять под какую битность она выдаёт размеры.
Win10x64 AhkSpy, Hotkey, ClockGui
133 2019-01-17 16:32:02 (изменено: YMP, 2019-01-17 16:34:37)
Re: AHK: Управление монитором, DDC/CI
Сама VS, по-моему, только и есть 32-битная. А битность проекта выбирается на панели инструментов из списка: x86 или x64. Соответственно этому будет и размер типов.
stdafx.h надо искать на вкладке Solution Explorer, там все файлы проекта видно.
134 2019-01-17 16:43:29 (изменено: YMP, 2019-01-17 16:44:47)
Re: AHK: Управление монитором, DDC/CI
Смещения членов структуры можно, например, так узнавать.
#include "stdafx.h"
using namespace std;
UINT getOffset(void* struct_ptr, void* member_ptr);
int main()
{
DISPLAYCONFIG_TARGET_DEVICE_NAME s;
cout << getOffset(&s, &s.monitorDevicePath) << endl;
system("echo. && pause");
return 0;
}
UINT getOffset(void* struct_ptr, void* member_ptr)
{
return (BYTE*) member_ptr - (BYTE*) struct_ptr;
}
Функция getOffset — для удобства преобразования типов, чтобы не возиться с этим в строке вывода. В С++ указатели тоже имеют разные типы. Поэтому просто вычесть указатель на один тип из указателя на другой не получится. Кроме того, если, например, вычесть один указатель на UINT из другого, то разница будет тоже в UINT'ах, а не в байтах.
135 2019-01-17 17:17:12 (изменено: serzh82saratov, 2019-01-17 17:18:36)
Re: AHK: Управление монитором, DDC/CI
Microsoft Visual Studio Professional 2017
Версия 15.7.4
Не нашёл такого файла, они там по алфавиту, вряд ли я мог пропустить. Я создал таковой, всё работает.
1>SizeOf.obj : error LNK2005: main уже определен в getOffset.obj
1>C:\Users\Sergio\Desktop\SizeOf\x64\Debug\SizeOf.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
А возможно запускать срр файлы в одном проекте отдельно от других?
То есть чтобы запустить один, надо в остальных переименовать функцию main.
И как в один файл добавить функции, и сверху вызывать нужную. main я так понял функция которая запускается при загрузке. Тяжёлый синтаксис, не пойму даже как функции вызывать.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
А зачем Professional? Есть же бесплатная Community. А то вот уже и stdafx.h почему-то нет, дальше больше, и трудно будет синхронизировать наш с вами опыт. Файл этот автоматически у меня создаётся при создании проекта, когда выбираю тип консольное приложение. Если пустой проект, то там не будет никаких файлов и нужно все самому потом создавать.
Все файлы cpp из проекта в итоге собираются в один экзешник (или dll), так что одинаковых функций не должно быть в разных файлах. Да, main — это точка входа в программу. Из неё и можно вызывать другие функции. Их нужно сначала объявлять вверху файла, как я объявил getOffset, а само определение функции с её кодом может быть под или над main, без разницы.
Re: AHK: Управление монитором, DDC/CI
stdafx.h в консольном есть, а в пустом проекте много файлов, может это одно из отличий. То есть вы консольное используете потому что в нём есть файлы, а так отличий нет.
А зачем Professional? Есть же бесплатная Community
Оказалось что она была установлена, пока не хочется что то трогать.
Их нужно сначала объявлять вверху файла, как я объявил getOffset, а само определение функции с её кодом может быть под или над main, без разницы.
Спасибо, получилось.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Размер члена структуры можно смотреть, не создавая структуры.
sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME::monitorDevicePath)
А вот смещение, похоже, никак не узнаешь без создания. Или я не знаю как. Так что проще всего, думаю, создать её и потом уже использовать саму переменную для sizeof и для getOffset.
Re: AHK: Управление монитором, DDC/CI
serzh82saratov, так показывает у тебя?
DllCall("GetDisplayConfigBufferSizes", "uint", QDC_ONLY_ACTIVE_PATHS := 2, "uint*", numPathArrayElements, "uint*", numModeInfoArrayElements)
VarSetCapacity(DISPLAYCONFIG_PATH_INFO, (20+48+4)*numPathArrayElements, 0)
VarSetCapacity(DISPLAYCONFIG_MODE_INFO, 64*numModeInfoArrayElements, 0)
DllCall("QueryDisplayConfig", "uint", QDC_ONLY_ACTIVE_PATHS := 2, "ptr", &numPathArrayElements, "ptr", &DISPLAYCONFIG_PATH_INFO, "ptr", &numModeInfoArrayElements, "ptr", &DISPLAYCONFIG_MODE_INFO, "uint", 0)
loop % NumGet(numPathArrayElements, "int")
{
adapterId := NumGet(DISPLAYCONFIG_PATH_INFO, (A_Index-1)*72+20, "int64")
id := NumGet(DISPLAYCONFIG_PATH_INFO, (A_Index-1)*72+28, "uint")
VarSetCapacity(DISPLAYCONFIG_TARGET_DEVICE_NAME, 420, 0)
NumPut(DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME := 2, DISPLAYCONFIG_TARGET_DEVICE_NAME, 0, "uint")
NumPut(420, DISPLAYCONFIG_TARGET_DEVICE_NAME, 4, "uint")
NumPut(adapterId, DISPLAYCONFIG_TARGET_DEVICE_NAME, 8, "int64")
NumPut(id, DISPLAYCONFIG_TARGET_DEVICE_NAME, 16, "uint")
DllCall("DisplayConfigGetDeviceInfo", "ptr", &DISPLAYCONFIG_TARGET_DEVICE_NAME)
MsgBox, % StrGet(&DISPLAYCONFIG_TARGET_DEVICE_NAME + 36)
}
Re: AHK: Управление монитором, DDC/CI
Да, показывает правильно оба монитора.
Win10x64 AhkSpy, Hotkey, ClockGui
Re: AHK: Управление монитором, DDC/CI
Прочитал всю тему, но так и не понял, можно ли переключать режимы. Например, со стандартного на игровой?
Re: AHK: Управление монитором, DDC/CI
VESA MCCSStandard Reproduction ProhibitedVersion 2.2a©Copyright2006 –2011Video Electronics Standards AssociationPage 56of 131Table 8-4: Image Adjustment VCP CodesCodeNameTypeFunctionDescriptionDChDisplay ApplicationR/WNCPermits the selection of a preset optimized by manufacturer for an application type or the selection of a user defined setting.Byte: SL00hStand / default mode01hProductivity (e.g. office applications)02hMixed (e.g. internet with mix of text and images)03hMovie04hUser defined05hGames (e.g. games console / PC game)06hSports (e.g. fast action)07hProfessional (all signal processing disabled)08hStandard / default mode with intermediate power consumption09hStandard / default mode with low power consumption0AhDemonstration (used for high visual impact in retail etc.)0Bh-EFhReserved, must be ignoredF0hDynamic contrast≥ F1hReserved, must be ignoredNOTE:The condition(s) associated with options 00h→0Ah(inclusive) are defined by the display manufacturer and may include all or some of luminance, contrast, gamma settings, etc.