1 (изменено: Indomito, 2014-08-31 09:59:52)

Тема: AHK: видеокарта Nvidia - как обратится в функциям API

Я случайно наткнулся на то что давно искал - AHK: Изменение яркости экрана (пост №2)

Но везде фигурирует - setbrightness or setcontrast and setgamma
А как получить обратное т.е. GET (яркость, контрастность и гамма)?

Только на Си(судя по документации, PDF-файл)?
Может есть способ сделать это методами AHK, а то получается метод "полтелеги"?

P.S. Цвет не красный, а кирпичный - код #b22222

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

2 (изменено: YMP, 2014-08-31 10:29:25)

Re: AHK: видеокарта Nvidia - как обратится в функциям API

При чём тут Си? Это же функции из какой-то DLL? Какая разница, set у них в имени или get? Если функция существует, её можно вызвать. Если не существует — нельзя, даже на Си.

3

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Да всё было ничего, но

//---------------------------------------------------------------------
// NvGetDisplayInfo.c: NVCPL API example
//---------------------------------------------------------------------
// This example program demonstrates the use of the following APIs:
// NvGetDisplayInfo
// NvEnumDisplaySettings
// EnumDisplayDevices
// NvSelectDisplayDevice
// NvRefreshConnectedDevices
// NvGetConnectedDevicesString
// NvGetActiveDevicesString
//---------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include “NvPanelApi.h”

где взять заголовочный файл определений NvPanelApi.h? И таких много, т.е. для каждой функции он свой + я не очень представляю как, через rundll32.exe обратиться к конкретной точке самой DLL - нужен NAME.h
Может я и не прав и всё проще, DLL то одна - NvCpl.dll, а формат обращения тоже один - rundll32.exe NvCpl.dll,dtcfg <command> <display#> [arg1] [arg2] [arg3] [arg4]
Но тут одни SET-сы

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

4

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Файл тут можно взять: http://http.download.nvidia.com/develop … /NvCpl.zip. "Для каждой функции свой" — это вы о чём?

5 (изменено: Indomito, 2014-09-01 11:14:28)

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Я о простой вещи...

Установить нормальную "дефолтную" яркость будет так

rundll32.exe NvCpl.dll,dtcfg setbrightness 1 all 0

——————————————————————————————————————————
Далее...
Контраст, соответственно, «setcontrast», от «-82» до «82».
Гамма, соответственно, «setgamma», от «0.5» до «6.0».

Сброс:

rundll32.exe NvCpl.dll,dtcfg setdefaults 1 color

«1» — номер монитора, «all» — все каналы.
——————————————————————————————————————————
Я лично не меняю ни один из параметров(просто у меня хороший монитор с распознаванием) через панель NVidia, у жены и детей другая история.

У жены базой является ПО ICE Book Reader т.е. это и есть значение по умолчанию, а для игр и аналогичного ПО используются значения от базы. Можно конечно написать скрип с INI-файлом, где значением по умолчанию будет настройка для ПО ICE Book Reader.

Я бы просто хотел считать то, что есть значение  базы и от него "танцевать".
Да и вообще хотелось считать текущее значение, что бы понимать, что мне удобно, ну и не только мне — желательно используя один язык программирования, в данном контексте это AHK.


P.S. Если не сложно, то приведите пример получения текущей яркости на основе файлов NvCpl.h и NvPanelApi.h

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

6

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Ну, это ещё надо разобраться, как можно (если можно) её получить. Пока не могу примера дать.

7

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Согласно описанию, это должно писать яркость в буфер команды. Но у меня ничего не пишет, а ret равно 7, т.е., видимо, NV_NOTIMPLEMENTED       =   7,  // Feature not implemented. У вас этот код что показывает?


cmd = getbrightnessvalue 0 all
VarSetCapacity(cmdline, StrLen(cmd) * 2, 0)
StrPut(cmd, &cmdline, "cp0")
ret := DllCall("nvcpl.dll\dtcfgex", "ptr", &cmdline, "cdecl")
MsgBox, %ret% %ErrorLevel% %A_LastError%
MsgBox, % StrGet(&cmdline, "cp0")

8 (изменено: Indomito, 2014-09-01 17:17:51)

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Сорри за долгое молчание, но не смотря на подписку на почту ничего не пришло... пока сам не заглянул на форум.

Запустил и получил два  сообщения.

Первое

7 0 0

Второе

getbrightnessvalue 0 all

Ничего не понял... это что было то?

Видимо второе это - cmd = getbrightnessvalue 0 all

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

9

Re: AHK: видеокарта Nvidia - как обратится в функциям API

То же самое, что и у меня, т.е. не фурычит. Команда передаётся функции в буфере cmdline. В него же функция должна вернуть значение яркости. Но не возвращает.

Единственное, что ещё нашёл, — поле в структуре NVDISPLAYINFO под названием fGammaCharacteristic;             // Gamma transfer characteristic for monitor (for example: 2.2). Про яркость и контрастность ничего.

10 (изменено: Indomito, 2014-09-01 20:17:55)

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Знаешь я когда то с кем то... сорри забыл с кем написал функцию входного потока на консоль.
По сути это stdio.h + аналогичная стандартная библиотека ввода/вывода на консоль

+ Функция RunCon
; ======= Функция RunCon ==================================

RunCon(CmdLine, Input, ByRef Output)
{
    static BufSizeChar := 1024, hParent := 0
    static Show := 0, Flags := 0x101  ; STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW
    static Buf, BufSizeByte, ProcessInfo, StartupInfo, PipeAttribs
    static piSize, siSize, paSize, flOffset, shOffset, ihOffset
    static inOffset, outOffset, errOffset, thrOffset
    If (!hParent) {
        BufSizeByte := A_IsUnicode ? BufSizeChar * 2 : BufSizeChar
        If (A_PtrSize = 8) {
            piSize := 24, siSize := 104, paSize = 24
            flOffset := 60, shOffset := 64, ihOffset := 16
            inOffset := 80, outOffset := 88, errOffset := 96
            thrOffset := 8
        }
        Else {
            piSize := 16, siSize := 68, paSize = 12
            flOffset := 44, shOffset := 48, ihOffset := 8
            inOffset := 56, outOffset := 60, errOffset := 64
            thrOffset := 4
        }
        VarSetCapacity(Buf, BufSizeByte, 0),    VarSetCapacity(ProcessInfo, piSize, 0)
        VarSetCapacity(StartupInfo, siSize, 0), VarSetCapacity(PipeAttribs, paSize, 0)
        NumPut(siSize, StartupInfo, 0, "uint"), NumPut(Flags, StartupInfo, flOffset, "uint")
        NumPut(Show, StartupInfo, shOffset, "ushort")
        NumPut(paSize, PipeAttribs, 0, "uint"), NumPut(1, PipeAttribs, ihOffset, "int")
        hParent := DllCall("GetCurrentProcess", "ptr")
    }
    DllCall("CreatePipe", "ptr *", hRead1_tmp, "ptr *", hWrite2
                        , "ptr", &PipeAttribs, "uint", 0)
    DllCall("CreatePipe", "ptr *", hRead2, "ptr *", hWrite1_tmp
                        , "ptr", &PipeAttribs, "uint", 0)

    NumPut(hRead2,  StartupInfo, inOffset, "ptr") 
    NumPut(hWrite2, StartupInfo, outOffset, "ptr")
    NumPut(hWrite2, StartupInfo, errOffset, "ptr")
    
    DllCall("DuplicateHandle", "ptr", hParent, "ptr", hRead1_tmp
                             , "ptr", hParent, "ptr *", hRead1
                             , "uint", 0, "uint", 0
                             , "uint", 2)    ; DUPLICATE_SAME_ACCESS
    DllCall("CloseHandle", "ptr", hRead1_tmp)
    DllCall("DuplicateHandle", "ptr", hParent, "ptr", hWrite1_tmp
                             , "ptr", hParent, "ptr *", hWrite1
                             , "uint", 0, "uint", 0
                             , "uint", 2)
    DllCall("CloseHandle", "ptr", hWrite1_tmp)
    
    DllCall("ExpandEnvironmentStrings", "str", CmdLine, "str", Buf, "uint", BufSizeChar)
    CmdLine := Buf
    Ret := DllCall("CreateProcess", "ptr", 0, "str", CmdLine, "ptr", 0, "ptr", 0
                                  , "uint", 1, "uint", 0, "ptr", 0, "ptr", 0
                                  , "ptr", &StartupInfo, "ptr", &ProcessInfo)
    If (!Ret) {
        MsgBox,, %A_ThisFunc%, Не удалось создать процесс.
        Output := ""
        Return 1
    }
    hChild := NumGet(ProcessInfo, 0, "ptr")
    DllCall("CloseHandle", "ptr", NumGet(ProcessInfo, thrOffset, "ptr"))
    DllCall("CloseHandle", "ptr", hRead2)
    DllCall("CloseHandle", "ptr", hWrite2)
    If (Input) {
        InLen := StrLen(Input) + 2
        VarSetCapacity(InBuf, InLen, 0)
        StrPut(Input . "`r`n", &InBuf, "cp866")
        DllCall("WriteFile", "ptr", hWrite1, "ptr", &InBuf, "uint", InLen
                           , "uint *", BytesWritten, "uint", 0)
    }
    DllCall("CloseHandle", "ptr", hWrite1)
    Output := ""
    Loop {
        If not DllCall("ReadFile", "ptr", hRead1, "ptr", &Buf, "uint", BufSizeByte
                                 , "uint *", BytesRead, "uint", 0)
            Break
        NumPut(0, Buf, BytesRead, "Char")
        Output .= StrGet(&Buf, "cp866")
    }
    DllCall("CloseHandle", "ptr", hRead1)
    DllCall("GetExitCodeProcess", "ptr", hChild, "int *", ExitCode)
    DllCall("CloseHandle", "ptr", hChild)
    Return ExitCode
}

может её воспользоваться?

Я передаю netsh interface ipv4 show addresses а в ответ получаю состояние сетевого контроллера и посылаю то что мне нужно.

Могу выложить скрипт полностью.

P.S. Иными методами получить состояние сети было не возможно, AHK этого просто нет.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

11

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Это моя функция, но зачем она здесь?

12 (изменено: Indomito, 2014-09-02 09:22:13)

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Так как в файле имеет место три хидера

#include <stdio.h>
#include <conio.h>
#include "NvCpl.h"

3-й понятно зачем, а первые два не думаю/не проверял что служат только диагностических сообщений...
Всё на уровне идеи....
Когда команда netsh interface ipv4 show addresses работала не верно, только RunCon помог решить проблему, правда его пришлось исправить - проблемы с кодировкой.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

13

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Так это же исходник тестовой программы, где демонстрируется использование каких-то функций. Программа консольная, отсюда и заголовочные файлы. Они нужны компилятору для сбора этой программы.

Проблема в том, что нету функций для считывания яркости, только что-то невнятное про "Gamma transfer characteristic for monitor". Не знаю, что это означает. Возможно, то, что фигурирует как гамма в настройках панели Nvidia. А может, и нет.

14 (изменено: Indomito, 2014-09-02 11:56:06)

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Они нужны компилятору для сбора этой программы.

ясно, т.е. теперь понятно.

нету функций для считывания яркости, только что-то невнятное про "Gamma transfer characteristic for monitor". Не знаю, что это означает.

кажется я понял про что это.
Если открыть панель Nvidia то...

http://i66.fastpic.ru/thumb/2014/0902/25/9c218e5c97df0de348676842548e6725.jpeg

Думаю что и rundll32.exe NvCpl.dll,dtcfg setbrightness 1 all -125 не сработает - надо проверять, но кажется я прав.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

15

Re: AHK: видеокарта Nvidia - как обратится в функциям API

YMP вообще ничего не работает, во всех возможных вариантах

Я набрал в ком. строке

Microsoft Windows [Version 6.1.7601]
(c) 2013, Корпорация Майкрософт. Все права защищены.

C:\Users\SASA>rundll32.exe NvCpl.dll,dtcfg setbrightness 1 all -125

C:\Users\SASA>rundll32.exe NvCpl.dll,dtcfg setbrightness 1 all -125

C:\Users\SASA>rundll32.exe NvCpl.dll,dtcfg setbrightness 1 all -125

C:\Users\SASA>

Ошибок - нет, Реакции - нет

Я где то ошибся?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

16

Re: AHK: видеокарта Nvidia - как обратится в функциям API

А скрипт AHK: Изменение яркости экрана (пост №1) пашет, правда, как я заметил, он использует данные из системы... но под конец запутался как именно.

Но  как поменять контрастность и гамму не понял, но ясно что считать текущее значение яркости он не может (могу ошибаться)

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

17

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Ну да, у меня set-команды тоже не работают, и переключение в настройках не помогает. Видимо, в текущей версии DLL эти все возможности не реализованы. Или хз.

Что касается другого способа, то есть и функция GetDeviceGammaRamp. Осталось понять, что такое Gamma Ramp и как из неё вывести значение гаммы.

18 (изменено: Indomito, 2014-09-02 13:18:26)

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Я даже выполнил команду по регистрации - regsvr32 NvCpl.dll

GetDeviceGammaRamp - это не функция AHK, видимо OS...
Нужно вытащить три значения яркость, контрастность и гамма... я тут вряд ли чем помогу.

P.S. Могу компильнуть на С++ прилагаемые исходники, но думаю результат будет аналогичный.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

19

Re: AHK: видеокарта Nvidia - как обратится в функциям API

В общем, я в целом понял, что это за рампа. Яркость и контрастность, наверно, можно понять, как  из неё извлечь, меняя настройки и сравнивая значения в рампе. Но вот как из неё вычислить гамму, совершенно не представляю. И, соответственно, как к ней применить заданную гамму, тоже.

Может быть, проще сохранить эти рампы (при нужных вам настройках) в файлы. А потом читать из файлов и применять.

20

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Может быть, проще сохранить эти рампы (при нужных вам настройках) в файлы. А потом читать из файлов и применять.

то же вариант и вполне нормальный.

Осталось понять как считать, как применить и как поменять, менять видимо через панель видимо.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

21 (изменено: YMP, 2014-09-03 08:08:15)

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Да, через панель менять и сохранять в соответствующие файлы. Вот код:


F11::    ; Сохраняем.
    File = %A_Desktop%\gramp.bin
    If !GetGammaRamp(File)
        MsgBox, Ошибка GetGammaRamp
Return

F12::    ; Применяем.
    File = %A_Desktop%\gramp.bin
    If !SetGammaRamp(File)
        MsgBox, Ошибка SetGammaRamp
Return


; =========================== Функции ==============================

GetGammaRamp(FileName)
{
    Static GRamp, GRampSize := 256 * 6
    If (!GRamp)
        VarSetCapacity(GRamp, GRampSize)
    hdcScreen := DllCall("GetDC", "ptr", 0, "ptr")
    Ret := DllCall("GetDeviceGammaRamp", "ptr", hdcScreen, "ptr", &GRamp)
    DllCall("ReleaseDC", "ptr", 0, "ptr", hdcScreen)
    If (!Ret)
        Return False
    If !(File := FileOpen(FileName, "w"))
        Return False
    File.Pos := 0
    File.RawWrite(&GRamp, GRampSize)
    File.Close()
    Return True
}

SetGammaRamp(FileName)
{
    Static GRamp, GRampSize := 256 * 6
    If (!GRamp)
        VarSetCapacity(GRamp, GRampSize)
    If !(File := FileOpen(FileName, "r"))
        Return False
    File.Pos := 0
    File.RawRead(&GRamp, GRampSize)
    File.Close()
    hdcScreen := DllCall("GetDC", "ptr", 0, "ptr")
    Ret := DllCall("SetDeviceGammaRamp", "ptr", hdcScreen, "ptr", &GRamp)
    DllCall("ReleaseDC", "ptr", 0, "ptr", hdcScreen)
    Return Ret? True:False
}

22

Re: AHK: видеокарта Nvidia - как обратится в функциям API

YMP пишет:

Да, через панель менять и сохранять в соответствующие файлы.

сенкс, это то что нужно.

Осталось два вопроса.

1. Как я понял из скрипта переменная File не ограничена данным путём, именем и расширением?

File = %A_Desktop%\gramp.bin

2. При изменении данных в панели надо нажимать применить, а вот при считывании из переменной File будут ли проблемы?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

23

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Не ограничена. Хотя при сохранении по горячей клавише, по-моему, проще просто вручную переименовывать получившийся файл как вам надо.

У меня картинка меняется уже при движении ползунков. Применить — это, видимо, где-то запомнить сделанные изменения. При считывании из файла проблем не заметил. Единственно, что настройки эти временные. Сейчас, например, вывел комп из сна и заметил, что вернулись те, которые стоят в панели.

24

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Не ограничена. Хотя при сохранении по горячей клавише, по-моему, проще просто вручную переименовывать получившийся файл как вам надо.

Хорошо что нет ограничений, а понятие "проще" относительное... для моей жены это сложнее - 100%
Не страшно что временные, я так и думал что они будут такие. Я на основе твоего скрипта напишу более простой для понимания.
Режимы гибернации, сна и т.д. отключены - только рестарт ОС будет влиять.... хотя надо проверить что возьмут приложения установленное скриптом или то что было ранее - вот что самое важное.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

25

Re: AHK: видеокарта Nvidia - как обратится в функциям API

Я на основе твоего скрипта напишу более простой для понимания.

В смысле? Куда проще-то? В функциях ничего лишнего нет.