1 (изменено: D_Pavel, 2011-10-20 10:48:15)

Тема: AHK: Регулировка яркости подсветки монитора

Пытаюсь разобраться, не получается. Подскажите кто знает.
Сделал так:

VarSetCapacity(VIDEOPARAMETERS, 16+21*4+256, 0)
 
NumPut(0x02C62061,VIDEOPARAMETERS,0)
NumPut(0x11D11097,VIDEOPARAMETERS,4)
NumPut(0xA0000F92,VIDEOPARAMETERS,8)
NumPut(0x6E15DF24,VIDEOPARAMETERS,12)

dwOffset = 0
dwCommand = 1
dwFlags = 0xffffffff ;all
dwBrightness := 88

NumPut(dwOffset, VIDEOPARAMETERS, 16)
NumPut(dwCommand, VIDEOPARAMETERS, 20)
NumPut(dwFlags, VIDEOPARAMETERS, 24)
NumPut(dwBrightness, VIDEOPARAMETERS, 72)
 
CDS_VIDEOPARAMETERS := 0x00000020
hwnd := 0
VarSetCapacity(devmode,156,0)

NumPut(156, devmode,36) 
err := DllCall( "ChangeDisplaySettingsExA", Str, "\\.\Display1", UInt,&devmode, UInt,hwnd, UInt,CDS_VIDEOPARAMETERS, UInt,&VIDEOPARAMETERS) 
dwFlags := NumGet(VIDEOPARAMETERS, 24)
dwBrightness := NumGet(VIDEOPARAMETERS, 72)

MsgBox ErrorLevel = %ErrorLevel%, err = %err%, dwBrightness = %dwBrightness%, dwFlags = %dwFlags%
Loop, 89
{
	Index := -1 + A_Index
	Index *= 4
	str := NumGet(VIDEOPARAMETERS, Index)
	mess = %mess%%Index% - %str%`n`r 

}
MsgBox %mess%

Ничего не происходит, яркость не меняется!

2

Re: AHK: Регулировка яркости подсветки монитора

Может эта тема будет полезной?

3

Re: AHK: Регулировка яркости подсветки монитора

Grey, та тема бесполезная.  Мне нужно регулировать реальную яркость подсветки, а не софтовую гамму.

4

Re: AHK: Регулировка яркости подсветки монитора

D_Pavel пишет:

Ничего не происходит, яркость не меняется!

А что возвращает функция чему равны переменные ErrorLevel и a_lasterror после её вызова?

5 (изменено: D_Pavel, 2011-10-19 10:55:40)

Re: AHK: Регулировка яркости подсветки монитора

0,0
PS: Это не смайл


Запусти скрипт который я выложил. Это практически полный код который должен работать.

6

Re: AHK: Регулировка яркости подсветки монитора

D_Pavel пишет:

Запусти скрипт который я выложил. Это практически полный код который должен работать.

Выдаёт "DISP_CHANGE_BADPARAM". Нужно правильно GUID вбить:

NumPut(0x02C62061,VIDEOPARAMETERS,0)
NumPut(0x1097,VIDEOPARAMETERS,4, "ushort")
NumPut(0x11d1,VIDEOPARAMETERS,6, "ushort")
NumPut(0x92,VIDEOPARAMETERS,8, "uchar")
NumPut(0x0F,VIDEOPARAMETERS,9, "uchar")
NumPut(0x00,VIDEOPARAMETERS,10, "uchar")
NumPut(0xA0,VIDEOPARAMETERS,11, "uchar")
NumPut(0x24,VIDEOPARAMETERS,12, "uchar")
NumPut(0xDF,VIDEOPARAMETERS,13, "uchar")
NumPut(0x15,VIDEOPARAMETERS,14, "uchar")
NumPut(0x6E,VIDEOPARAMETERS,15, "uchar")

7 (изменено: D_Pavel, 2011-10-19 12:19:07)

Re: AHK: Регулировка яркости подсветки монитора

Точно, там же 4-байтовые получились числа!
Вбил так, всё равно никакого эффекта...

NumPut(0x02C62061,VIDEOPARAMETERS,0)
NumPut(0x109711D1,VIDEOPARAMETERS,4)
NumPut(0x920F00A0,VIDEOPARAMETERS,8)
NumPut(0x24DF156E,VIDEOPARAMETERS,12)

И errorы все ==0

8 (изменено: Александр_, 2011-10-19 13:26:06)

Re: AHK: Регулировка яркости подсветки монитора

D_Pavel пишет:

Точно, там же 4-байтовые получились числа!
Вбил так, всё равно никакого эффекта...

NumPut(0x02C62061,VIDEOPARAMETERS,0)
NumPut(0x109711D1,VIDEOPARAMETERS,4)
NumPut(0x920F00A0,VIDEOPARAMETERS,8)
NumPut(0x24DF156E,VIDEOPARAMETERS,12)

И errorы все ==0

Ну во-первых нужно раскомментировать строку, в которой заполняется поле с размером структуры, а во-вторых GUID опять неверно заполнен. Если очень хочется записать по 4 байта, то это нужно делать так:

NumPut(0x02C62061,VIDEOPARAMETERS,0)
NumPut(0x11D11097,VIDEOPARAMETERS,4)
NumPut(0xA0000F92,VIDEOPARAMETERS,8)
NumPut(0x6E15DF24,VIDEOPARAMETERS,12)

Переменные в памяти хранятся в обратном порядке, т.е. 0x12345678 будет представлено так:
1 байт: 0x78
2 байт: 0x56
3 байт: 0x34
4 байт: 0x12
Аналогично и двухбайтовые переменные. А GUID определён как:

typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;

9

Re: AHK: Регулировка яркости подсветки монитора

Я думал GUID это просто последовательность однобайтовый чисел. Щас попробую, но не думаю что получится.

Александр_ пишет:

Ну во-первых нужно раскомментировать строку, в которой заполняется поле с размером структуры

Не понял, как и где заполняется поле с размером структуры?

10 (изменено: Александр_, 2011-10-19 14:13:32)

Re: AHK: Регулировка яркости подсветки монитора

D_Pavel пишет:

Не понял, как и где заполняется поле с размером структуры?

У вас в коде есть строчка:

VarSetCapacity(devmode,156,0) ;, NumPut(156, devmode,36)

команда, которая в комментариях и задаёт размер структуры. Нужно либо задавать размер, либо вообще не передавать эту структуру(передать 0).

11 (изменено: D_Pavel, 2011-10-19 18:22:18)

Re: AHK: Регулировка яркости подсветки монитора

Когда я ее раскомментаривал, вызов dll возвращал ошибку -5, потому закомментил, решил что там это число ошибочно или для других целей.. Для VIDEOPARAMETERS тоже нужно задавать размер структуры?

12

Re: AHK: Регулировка яркости подсветки монитора

D_Pavel пишет:

Когда я ее раскомментаривал, вызов dll возвращал ошибку -5

код такой?

VarSetCapacity(VIDEOPARAMETERS, 16+21*4+256+10, 0)
 
NumPut(0x02C62061,VIDEOPARAMETERS,0)
NumPut(0x1097,VIDEOPARAMETERS,4, "ushort")
NumPut(0x11d1,VIDEOPARAMETERS,6, "ushort")
NumPut(0x92,VIDEOPARAMETERS,8, "uchar")
NumPut(0x0F,VIDEOPARAMETERS,9, "uchar")
NumPut(0x00,VIDEOPARAMETERS,10, "uchar")
NumPut(0xA0,VIDEOPARAMETERS,11, "uchar")
NumPut(0x24,VIDEOPARAMETERS,12, "uchar")
NumPut(0xDF,VIDEOPARAMETERS,13, "uchar")
NumPut(0x15,VIDEOPARAMETERS,14, "uchar")
NumPut(0x6E,VIDEOPARAMETERS,15, "uchar")
 
dwOffset = 0
dwCommand = 1
dwFlags = 0x00000040 ;brightness
dwBrightness := 10
 
NumPut(dwOffset, VIDEOPARAMETERS, 16)
NumPut(dwCommand, VIDEOPARAMETERS, 20)
NumPut(dwFlags, VIDEOPARAMETERS, 24)
NumPut(dwBrightness, VIDEOPARAMETERS, 72)
 
dwFlags := NumGet(VIDEOPARAMETERS, 24)
dwBrightness := NumGet(VIDEOPARAMETERS, 72)
 
MsgBox ErrorLevel = %ErrorLevel%, VIDEOPARAMETERS = %VIDEOPARAMETERS%, dwFlags = %dwFlags%, dwBrightness = %dwBrightness%
 
CDS_VIDEOPARAMETERS := 0x00000020
hwnd := 0
VarSetCapacity(devmode,156,0)
NumPut(156, devmode,36) 
err := DllCall( "ChangeDisplaySettingsExA", Str, "\\.\Display1", UInt,&devmode, UInt,hwnd, UInt,CDS_VIDEOPARAMETERS, UInt,&VIDEOPARAMETERS) 
dwBrightness := NumGet(VIDEOPARAMETERS, 72)
 
MsgBox ErrorLevel = %ErrorLevel%, err = %err%, dwBrightness = %dwBrightness%

13 (изменено: D_Pavel, 2011-10-20 10:51:01)

Re: AHK: Регулировка яркости подсветки монитора

Немного не такой, переделал, ошибку не выдает, но яркость не возвращает и не регулирует. Обновил скрипт в первый пост.
Проверял, в свойствах монитора есть панель драйвера, в ней яркость регулируется.

14

Re: AHK: Регулировка яркости подсветки монитора

D_Pavel пишет:

Немного не такой, переделал, ошибку не выдает, но яркость не возвращает и не регулирует. Обновил скрипт в первый пост.
Проверял, в свойствах монитора есть панель драйвера, в ней яркость регулируется.

Ну там вообще флаги 0xffffffff, я не думаю, что это разумно для любой функции, ведь часть битов не документированы или не используются и могут быть использованы позднее. В итоге я тоже пока не смог поменять подсветку. Кстати, новая функция GetMonitorBrightness(vista+) у меня тоже не сработала- сбросила подсветку и вернула эту ошибку. SetMonitorBrightness изменила подсветку, но не совсем как надо- выставила 66 вместо 50 . Может через DeviceIoControl попробовать?

15

Re: AHK: Регулировка яркости подсветки монитора

Александр_ пишет:

Ну там вообще флаги 0xffffffff, я не думаю, что это разумно для любой функции, ведь часть битов не документированы или не используются и могут быть использованы позднее.

при команде на чтение флаги роли не играют, все равно перезаписываются. после выполнения команды они у меня равны 259, тоесть бит отвечающий за яркость не установлен.