1

Тема: AHK: Изменение яркости экрана

Хотел для игры приспособить код из аналогичной темы в "идеях": http://forum.script-coding.com/viewtopi … 379#p32379, но ничего не получилось.
Вот это прекрасно работает в самой Windows, но в игре не срабатывает.

#NoTrayIcon ; не отображать иконку скрипта в трее
#MaxHotkeysPerInterval 200
#NoEnv  ; Не использовать переменные окружения
#SingleInstance force
SetBatchLines -1

br := 128   ; Яркость в интервале от 0 до 255 (нормальное значение яркости 128)

#F2:: ; увеличить яркость Win + F2
#F1:: ; уменьшить яркость Win + F1

Brght_Step = 8 ; шаг регулировки

; -------------------
; НАЧАЛО КОНФИГУРАЦИИ
; -------------------

; Как долго отображать прогресс-бар (в миллисекундах)
vol_DisplayTime = 1500
; Прозрачность окна (0-255)
vol_TransValue = 200
; Цвет бэкграунда окна
vol_CW = EEEEEE   
vol_Width = 200  ; ширина прогресс-бара
vol_Thick = 20   ; высота прогресс-бара
; Позиция бара
vol_PosX := A_ScreenWidth/2 - vol_Width/2
vol_PosY := A_ScreenHeight/1.8 - vol_Thick/2
; --------------------
; КОНЕЦ КОНФИГУРАЦИИ
; --------------------
vol_BarOptionsMaster = 1:B1 R0-255 ZH%vol_Thick% ZX8 ZY4 W%vol_Width% X%vol_PosX% Y%vol_PosY% CW%vol_CW%


br += (InStr(A_ThisHotkey, "F1") ? -Brght_Step : Brght_Step )
If ( br > 256 )
   br := 256
If ( br < 0)
   br := 0
VarSetCapacity(gr, 512*3)
Loop,   256
{
   If  (nValue:=(br+128)*(A_Index-1))>65535
        nValue:=65535
   NumPut(nValue, gr,      2*(A_Index-1), "Ushort")
   NumPut(nValue, gr,  512+2*(A_Index-1), "Ushort")
   NumPut(nValue, gr, 1024+2*(A_Index-1), "Ushort")
}
hDC := DllCall("GetDC", "Uint", 0)
DllCall("SetDeviceGammaRamp", "Uint", hDC, "Uint", &gr)
DllCall("ReleaseDC", "Uint", 0, "Uint", hDC)


vol_ShowBars:
; Получаем значение яркости, т.к. пользователь или другие программы могли ее изменить
vol_Master := br
if vol_Master <> 128
{
  vol_Colour = Blue   
  vol_Text = Brightness
}
else
{
;  vol_Colour = Red
  vol_Text = Brightness (normal)

}


; Что бы избежать мигания окна, создаем окно только в том случае, если оно не существует
IfWinNotExist, BrightnessOSDxyz
{
    Progress, %vol_BarOptionsMaster%  CB%vol_Colour% CT%vol_Colour%, , %vol_Text%, BrightnessOSDxyz
    WinSet, Transparent, %vol_TransValue%, BrightnessOSDxyz
}

Progress, 1:%vol_Master% , , %vol_Text%
SetTimer, vol_BarOff, %vol_DisplayTime%
return


vol_BarOff:
SetTimer, vol_BarOff, off
Progress, 1:Off
return

А тот код, что там ниже для Nvidia, c обращением к rundll32.exe, вообще срабатывает странно. С гаммой запускается, но никакого эффекта не производит, а с контрастностью и яркостью даже не запускается даже вот так:

^F12::
rundll32.exe NvCpl.dll,dtcfg setbrightness 1 all 0
Return

==> This line does not contain a recognized action.
     Specifically: rundll32.exe NvCpl.dll,dtcfg setbrightness 1 all 0

Что я не так делаю?

2

Re: AHK: Изменение яркости экрана

В вашем первом примере меняется все же гамма, а не яркость.

F1::MoveBrightness(1)
F2::MoveBrightness(-1)

;############################################################################
; Functions
;############################################################################

MoveBrightness(IndexMove) {

	VarSetCapacity(SupportedBrightness, 256, 0)
	VarSetCapacity(SupportedBrightnessSize, 4, 0)
	VarSetCapacity(BrightnessSize, 4, 0)
	VarSetCapacity(Brightness, 3, 0)

	hLCD := DllCall("CreateFile"
	, Str, "\\.\LCD"
	, UInt, 0x80000000 | 0x40000000 ;Read | Write
	, UInt, 0x1 | 0x2  ; File Read | File Write
	, UInt, 0
	, UInt, 0x3  ; open any existing file
	, UInt, 0
	  , UInt, 0)

	if hLCD != -1
	{

		DevVideo := 0x00000023, BuffMethod := 0, Fileacces := 0
		  NumPut(0x03, Brightness, 0, "UChar")   ; 0x01 = Set AC, 0x02 = Set DC, 0x03 = Set both
		  NumPut(0x00, Brightness, 1, "UChar")      ; The AC brightness level
		  NumPut(0x00, Brightness, 2, "UChar")      ; The DC brightness level
		DllCall("DeviceIoControl"
		  , UInt, hLCD
		  , UInt, (DevVideo<<16 | 0x126<<2 | BuffMethod<<14 | Fileacces) ; IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS
		  , UInt, 0
		  , UInt, 0
		  , UInt, &Brightness
		  , UInt, 3
		  , UInt, &BrightnessSize
		  , UInt, 0)

		DllCall("DeviceIoControl"
		  , UInt, hLCD
		  , UInt, (DevVideo<<16 | 0x125<<2 | BuffMethod<<14 | Fileacces) ; IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS
		  , UInt, 0
		  , UInt, 0
		  , UInt, &SupportedBrightness
		  , UInt, 256
		  , UInt, &SupportedBrightnessSize
		  , UInt, 0)

		ACBrightness := NumGet(Brightness, 1, "UChar")
		ACIndex := 0
		DCBrightness := NumGet(Brightness, 2, "UChar")
		DCIndex := 0
		BufferSize := NumGet(SupportedBrightnessSize, 0, "UInt")
		MaxIndex := BufferSize-1

		Loop, %BufferSize%
		{
		ThisIndex := A_Index-1
		ThisBrightness := NumGet(SupportedBrightness, ThisIndex, "UChar")
		if ACBrightness = %ThisBrightness%
			ACIndex := ThisIndex
		if DCBrightness = %ThisBrightness%
			DCIndex := ThisIndex
		}

		if DCIndex >= %ACIndex%
		  BrightnessIndex := DCIndex
		else
		  BrightnessIndex := ACIndex

		BrightnessIndex += IndexMove

		if BrightnessIndex > %MaxIndex%
		   BrightnessIndex := MaxIndex

		if BrightnessIndex < 0
		   BrightnessIndex := 0

		NewBrightness := NumGet(SupportedBrightness, BrightnessIndex, "UChar")

		NumPut(0x03, Brightness, 0, "UChar")   ; 0x01 = Set AC, 0x02 = Set DC, 0x03 = Set both
        NumPut(NewBrightness, Brightness, 1, "UChar")      ; The AC brightness level
        NumPut(NewBrightness, Brightness, 2, "UChar")      ; The DC brightness level

		DllCall("DeviceIoControl"
			, UInt, hLCD
			, UInt, (DevVideo<<16 | 0x127<<2 | BuffMethod<<14 | Fileacces) ; IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS
			, UInt, &Brightness
			, UInt, 3
			, UInt, 0
			, UInt, 0
			, UInt, 0
			, Uint, 0)

		DllCall("CloseHandle", UInt, hLCD)
	}
}
F1::Run C:\nircmd.exe changebrightness 10
F2::Run C:\nircmd.exe changebrightness -10

3

Re: AHK: Изменение яркости экрана

Не срабатывает последний код. Ни в Windows, ни в игре.
Может nircmd.exe, какая-то особая нужна?
У меня 281.2.2.6.

4 (изменено: Kurskador, 2018-03-25 19:23:44)

Re: AHK: Изменение яркости экрана

Работает он только в Windows, а в игре - нет. Всё как с первым кодом из первого поста.

5

Re: AHK: Изменение яркости экрана

Больше ничего нельзя сделать?