101

Re: AHK: Управление монитором, DDC/CI

serzh82saratov пишет:

В UINT32.

OR 1.

102

Re: AHK: Управление монитором, DDC/CI

Если б вы знали глубину моего непонимания вашего ответа...

NumPut(OR 1., DISPLAYCONFIG_TARGET_DEVICE_NAME, 20, "uint")

Так?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

103

Re: AHK: Управление монитором, DDC/CI

Нет, я имел в виду, что сначала формируете этот UINT32, а потом его и пишете. Если там только первый бит и больше ничего, то просто пишите 1 как "uint". А если там ещё что-то и надо просто добавить первый бит, то


number := number | 1
; или можно сокращённо (если я ничего не путаю)
number |= 1
; потом уже
NumPut(number,  DISPLAYCONFIG_TARGET_DEVICE_NAME, 20, "uint")

Только точно ли там смещение 20?

104

Re: AHK: Управление монитором, DDC/CI

Так number чему равен, 0xffffffff?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

105

Re: AHK: Управление монитором, DDC/CI

YMP пишет:

Если там только первый бит и больше ничего, то просто пишите 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)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

106

Re: AHK: Управление монитором, DDC/CI

Нет, первый (точнее, нулевой) — это самый младший бит. Иначе получится ерунда: в байте он первый, а в слове (два байта) уже девятый будет? Считают биты с конца.

107

Re: AHK: Управление монитором, DDC/CI

Ок, для закрепления, как установить 2 и 4 бит = 1 в UINT32?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

108

Re: AHK: Управление монитором, DDC/CI

На самом деле это будут первый и третий (считаем с нуля), так что получаем 2 в степени 1 и 2 в степени 3, т.е. 2 и 8. Вот эти числа и нужно поместить в UINT32.

Т.е. битам соответствуют степени двойки. В байте, например, это 1, 2, 4, 8, 16, 32, 64, 128.

109

Re: AHK: Управление монитором, DDC/CI

number |= 10 ; 2 + 8

110 (изменено: serzh82saratov, 2019-01-15 23:44:42)

Re: AHK: Управление монитором, DDC/CI

YMP пишет:

Иначе получится ерунда: в байте он первый, а в слове (два байта) уже девятый будет?

Ну если считать слева направо, то также и останется первым.
В общем считать надо справа налево.

YMP пишет:

(считаем с нуля)

Почему тогда пишут первый а не нулевой?

Setting this member is equivalent to setting the first bit of the 32-bit value member

И чем удобнее с нуля, если в байте 8 бит, а старший называется "седьмым".
Или это принято чтобы не путаться в такой записи, а нулевая степень всегда равно 1.
Number |= (1<<1) | (1<<3)

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

111

Re: AHK: Управление монитором, DDC/CI

YMP пишет:

Только точно ли там смещение 20?

Я посчитал это как 20 байт, а тот параметр идёт следующим.

typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER {
  DISPLAYCONFIG_DEVICE_INFO_TYPE type;
  UINT32                         size;
  LUID                           adapterId;
  UINT32                         id;
} DISPLAYCONFIG_DEVICE_INFO_HEADER;
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

112

Re: AHK: Управление монитором, DDC/CI

serzh82saratov пишет:

Почему тогда пишут первый а не нулевой?

Привыкли люди с 1 считать. С нулевым бы проблемы не было, конечно, а вот следующие куча народу по привычке поняла бы неправильно. Думаю, поэтому.

С нуля удобнее, если надо сообразить, какой бит какому числу соответствует.

serzh82saratov пишет:

Я посчитал это как 20 байт

А почему 20? Надо, наверно, в Visual C++ проверить, это проще всего.

113

Re: AHK: Управление монитором, DDC/CI

YMP пишет:

Надо, наверно, в Visual C++ проверить, это проще всего.

До этого ещё мой прогресс не дошёл. (

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

114 (изменено: 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 есть сомнения.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

115

Re: AHK: Управление монитором, DDC/CI

Нет, действительно 20 показывает команда sizeof. А DISPLAYCONFIG_TARGET_DEVICE_NAME — 420.

116

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;
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

117

Re: AHK: Управление монитором, DDC/CI

serzh82saratov пишет:

До этого ещё мой прогресс не дошёл. (

Там много кода не надо. Вот всего лишь.

int main()
{
	wcout << sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME) << endl;
	system("echo. && pause");
    return 0;
}

А если поставить курсор на название типа и нажать F12, откроется его определение в заголовочном файле. Там так же можно открыть определения типов всех членов структуры.

118 (изменено: 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
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

119

Re: AHK: Управление монитором, DDC/CI

Проще так:

Number := 0x01020408
Loop 32
   bin := (mod(A_Index, 8) ? "" : " ") . (Number >> (A_Index - 1))&1 . bin
MsgBox, % bin
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

120

Re: AHK: Управление монитором, DDC/CI

Спасибо, понял, сейчас как раз разбирал код

Number >> (A_Index - 1))&1

Я просто 4х байтовое число как пример привёл, изначально рассчитывая код на их разное кол-во.
В общем в двоичном виде так и должно выглядеть.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

121 (изменено: 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
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

122

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
}

123

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
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

124

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
}

125

Re: AHK: Управление монитором, DDC/CI

Так без пробелов через 8 бит.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

126 (изменено: serzh82saratov, 2019-01-17 05:15:30)

Re: AHK: Управление монитором, DDC/CI

YMP пишет:

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
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

127 (изменено: 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)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

128 (изменено: YMP, 2019-01-17 10:12:42)

Re: AHK: Управление монитором, DDC/CI

В этом проблема с отсутствием строгой типизации переменных. С одной стороны проще, а с другой: как дать АНК понять, что результат инверсии должен быть 64-битным? Хрен его знает. Сиди и голову ломай. Может, во второй версии этой проблемы нет.

serzh82saratov пишет:

Не могу из этого сделать выводы, можете своими словами объяснить принцип действия.

При инверсии 1 становится 0, а & с 0 даёт 0 в любом случае. Остальные биты, бывшие 0, становятся 1, а & с 1 даёт 1, если была 1, и 0, если был 0. Т.е. там ничего в Number не изменится. Но т.к. АНК сокращает второй операнд до 32 бит, то выше 32 бит получаются нули, которые обнуляют и верхнюю половину Number.

129

Re: AHK: Управление монитором, DDC/CI

Ясненько.

YMP пишет:

Вот всего лишь.

int main()
{
	wcout << sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME) << endl;
	system("echo. && pause");
    return 0;
}

Пишет:

идентификатор "DISPLAYCONFIG_TARGET_DEVICE_NAME" не определен

Нужно что то "заинклудить" или как то объявить DISPLAYCONFIG_TARGET_DEVICE_NAME?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

130

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.

131

Re: AHK: Управление монитором, DDC/CI

Если нужен вывод в hex, то можно так:


cout << "0x" << hex << uppercase << sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME) << endl;

132

Re: AHK: Управление монитором, DDC/CI

YMP
Спасибо за подробный ответ.
stdafx.h не нашёл, просто прописал перед main.
У меня VS х32, это влияет на sizeof? То есть как понять под какую битность она выдаёт размеры.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

133 (изменено: YMP, 2019-01-17 16:34:37)

Re: AHK: Управление монитором, DDC/CI

Сама VS, по-моему, только и есть 32-битная. А битность проекта выбирается на панели инструментов из списка: x86 или x64. Соответственно этому будет и размер типов.

stdafx.h надо искать на вкладке Solution Explorer, там все файлы проекта видно.

134 (изменено: 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 (изменено: 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 я так понял функция которая запускается при загрузке. Тяжёлый синтаксис, не пойму даже как функции вызывать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

136

Re: AHK: Управление монитором, DDC/CI

А зачем Professional? Есть же бесплатная Community. А то вот уже и stdafx.h почему-то нет, дальше больше, и трудно будет синхронизировать наш с вами опыт. Файл этот автоматически у меня создаётся при создании проекта, когда выбираю тип консольное приложение. Если пустой проект, то там не будет никаких файлов и нужно все самому потом создавать.

Все файлы cpp из проекта в итоге собираются в один экзешник (или dll), так что одинаковых функций не должно быть в разных файлах. Да, main — это точка входа в программу. Из неё и можно вызывать другие функции. Их нужно сначала объявлять вверху файла, как я объявил getOffset, а само определение функции с её кодом может быть под или над main, без разницы.

137

Re: AHK: Управление монитором, DDC/CI

stdafx.h в консольном есть, а в пустом проекте много файлов, может это одно из отличий. То есть вы консольное используете потому что в нём есть файлы, а так отличий нет.

YMP пишет:

А зачем Professional? Есть же бесплатная Community

Оказалось что она была установлена, пока не хочется что то трогать.

YMP пишет:

Их нужно сначала объявлять вверху файла, как я объявил getOffset, а само определение функции с её кодом может быть под или над main, без разницы.

Спасибо, получилось.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

138

Re: AHK: Управление монитором, DDC/CI

Размер члена структуры можно смотреть, не создавая структуры.


sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME::monitorDevicePath)

А вот смещение, похоже, никак не узнаешь без создания. Или я не знаю как. Так что проще всего, думаю, создать её и потом уже использовать саму переменную для sizeof и для getOffset.

139

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)
}

140

Re: AHK: Управление монитором, DDC/CI

Да, показывает правильно оба монитора.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui