Имя: Пароль:
IT
Админ
Как программно изменить яркость монитора через SendMessage?
0 popcorn
 
14.10.11
06:16
Нужно изменить яркость монитора из скрипта. Скрипт не умеет рулить портами, поэтому можно испольтзовать только SendMessage или dllcall. Подскажите команду изменения яркости?
1 skunk
 
14.10.11
06:30
напиши програмку на дельфи  и вызывай из скрипта
2 mishaPH
 
14.10.11
07:59
табло что-ли делаешь?
3 popcorn
 
17.10.11
06:31
(1) Без проблем! Какая функция на дельфи изменяет яркость?
(2) Ага.
4 skunk
 
17.10.11
06:35
5 skunk
 
17.10.11
06:37
в этом пурги меньше

(******************************************************************************
                          A3D nGine 2003
                   a3d.intelligentdevelopment.sk
                  [email protected]

                   Open Source 3D Graphics Engine

******************************************************************************
*                                                                            *
* This program is distributed in the hope that it will be useful,            *
* but WITHOUT ANY WARRANTY; without even the implied warranty of             *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
* GNU General Public License for more details.                               *
*                                                                            *
******************************************************************************)
unit A3D_GAMMA;

interface
uses math, windows;

type

 TGammaRamp = packed record
   R, G, B: array[0..255] of Word;
 end;

procedure A3D_StoreOriginalGamma(dc: HDC);
procedure A3D_SetNewGamma(dc: HDC; val: single);
procedure A3D_RestoreGamma(dc: HDC);

var
 originalRamp, adjustedRamp: TGammaRamp;

implementation

procedure A3D_StoreOriginalGamma(dc: HDC);
begin

 // Get the system's current gamma ramp, so we can restore later.
 FillChar(originalRamp, SizeOf(originalRamp), 0);
 GetDeviceGammaRamp(dc, originalRamp);
 adjustedRamp := originalRamp;


end;

procedure A3D_SetNewGamma(dc: HDC; val: single);
var i, v            : integer;
begin
 for i := 0 to 255 do
 begin
   v := Round(255 * Power(i / 255, val));
   if v > 255 then v := 255;
   // You can adjust each curve separately, but you usually shouldn't need to.
   adjustedRamp.R[i] := v shl 8;
   adjustedRamp.G[i] := v shl 8;
   adjustedRamp.B[i] := v shl 8;
 end;

 // Send the adjusted gamma ramp to the video card.
 SetDeviceGammaRamp(dc, adjustedRamp);


end;

procedure A3D_RestoreGamma(dc: HDC);
begin
 SetDeviceGammaRamp(dc, originalRamp);
end;
end.
6 popcorn
 
17.10.11
07:02
(4)(5) Не софтовую гамму надо изменять, а реальную яркость подсветки. Как кнопками на мониторе, но только через DDC
7 Андрюха
 
17.10.11
07:24
Посмотри ChangeDisplaySettingsEx
8 popcorn
 
17.10.11
07:54
(7) Не нашел там такого
9 Андрюха
 
17.10.11
08:09
(8) LONG ChangeDisplaySettingsEx(
LPCTSTR lpszDeviceName,  
LPDEVMODE lpDevMode,    
HWND hwnd,              
DWORD dwflags,          
LPVOID lParam);

В случае, когда dwflags = CDS_VIDEOPARAMETERS, то lParam указывает на:

dwOffset;
dwCommand;
dwFlags;
dwMode;
dwTVStandard;
dwAvailableModes;
dwAvailableTVStandard;
dwFlickerFilter;
dwOverScanX;
dwOverScanY;
dwMaxUnscaledX;
dwMaxUnscaledY;
dwPositionX;
dwPositionY;
dwBrightness;
dwContrast;
dwCPType;
dwCPCommand;
dwCPStandard;
dwCPKey;
bCP_APSTriggerBits;
bOEMCopyProtection[256];

Т.е. в твоем случае представляют интерес dwBrightness и dwContrast.
10 1Сергей
 
17.10.11
10:03
э... разве настройки моника можно делать с компьютера?
11 popcorn
 
17.10.11
10:05
(10) Да
12 popcorn
 
17.10.11
13:28
(9) Чото не получается прочитать эти lParam! Пустота одна считывается.
13 Torquader
 
17.10.11
14:58
Не каждый монитор поддерживает управление с компьютера, а если и поддерживает, то через подключение DVI, где карта выставляет параметры для монитора.
Управление кнопками монитора предусмотрено только у тех мониторов, которые подключаются дополнительно USB-шнуром, но там им управляет специальная программа.
14 Midaw
 
17.10.11
15:02
(0) нету функции в API, но есть функции в видеодрайверах, либо отдельных dll платных. в линухе есть бесплатная утилита, в том числе для командной строки
15 Midaw
 
17.10.11
15:08
(14) беру свои слова обратно...

(9)+ http://msdn.microsoft.com/ru-ru/library/dd183413(v=vs.85).aspx
Структура настроек http://msdn.microsoft.com/ru-ru/library/dd145196(v=vs.85).aspx
16 Midaw
 
17.10.11
15:12
интересно, а умеет ли ChangeDisplaySettingsEx переключать входной разьем у монитора?
17 smaharbA
 
17.10.11
15:21
гамму можно
18 popcorn
 
18.10.11
06:01
(15) смотри (9), было уже.
Эта структура VIDEOPARAMETERS у меня не считывается. Точнее считывается какая-то пустота, не пойму что я делаю не так. Кто-нибудь пробовал?
19 Андрюха
 
18.10.11
10:48
(18) Передаешь указатель?
20 popcorn
 
18.10.11
10:54
(19) Передаю.
21 Андрюха
 
18.10.11
10:54
В смысле ТОЧНО УКАЗАТЕЛЬ?
22 popcorn
 
18.10.11
10:56
(21) Абсолютно. LPDEVMODE считывается, а lParam не считывается. Может какую-то команду надо туда записать перед вызовом?
23 popcorn
 
18.10.11
10:58
CDS_VIDEOPARAMETERS := 0x00000020
VarSetCapacity(devmode,156,0), NumPut(156,devmode,36)
DllCall( "EnumDisplaySettingsA", UInt,0, UInt,-1, UInt,&devmode )
MsgBox ErrorLevel = %ErrorLevel%
DllCall( "ChangeDisplaySettingsExA", Str, "\\.\Display1", UInt,&devmode, UInt,hwnd, UInt,CDS_VIDEOPARAMETERS, UInt,&VIDEOPARAMETERS)

типа того
24 popcorn
 
18.10.11
11:01
"&" перед переменной означает что это указатель

Когда CDS_VIDEOPARAMETERS = 0, то записывается devmode, когда CDS_VIDEOPARAMETERS =  0x00000020, то devmode не влияет ни на что, но VIDEOPARAMETERS тоже не дают никакого эффекта, ни записываются, ни считываются. Думаю должна быть команда на считывание и на запись. Только не пойму какая
25 H A D G E H O G s
 
18.10.11
11:03
Откуда такая уверенность, что lParam должен на что то указывать?
Это вы в нем должны указывать на созданную структуру с заполненными новыми параметрами.
26 H A D G E H O G s
 
18.10.11
11:03
Функция в Lparam ничего не возвращает
27 popcorn
 
18.10.11
11:05
(26) Наверное. А как тогда прочитать текущие настройки которые нужно заполнить в Lparam чтобы не сбить то что не нужно менять?
28 Андрюха
 
18.10.11
11:16
(26) Она и не должна туда ничего возвращать, она оттуда берет.
type
     VIDEOPARAMETERS = packed record
       AGuid: TGUID;  {02C62061-1097-11d1-920F-00A024DF156E}
       dwOffset,
       dwCommand,
       dwFlags,
       dwMode,
       dwTVStandard,
       dwAvailableModes,
       dwAvailableTVStandard,
       dwFlickerFilter,
       dwOverScanX,
       dwOverScanY,
       dwMaxUnscaledX,
       dwMaxUnscaledY,
       dwPositionX,
       dwPositionY,
       dwBrightness,
       dwContrast,
       dwCPType,
       dwCPCommand,
       dwCPStandard,
       dwCPKey: DWORD;
       bCP_APSTriggerBits: Boolean;
       bOEMCopyProtection: array[0..255] of char;
     end;
   
   procedure TForm1.Button1Click(Sender: TObject);
   var
     devmode: _devicemodeA;
     vParams: VIDEOPARAMETERS;
   begin
     EnumDisplaySettings(nil,ENUM_CURRENT_SETTINGS,devmode);
     FillChar(vParams,SizeOf(vParams),0);
     vParams.dwBrightness:=50;
     ChangeDisplaySettingsEx(nil,devmode,0,CDS_VIDEOPARAMETERS,@vParams);
   end;
29 H A D G E H O G s
 
18.10.11
11:18
(28) Ну ты посмотри, что автор писал. А ты этого не видел.
30 popcorn
 
18.10.11
11:19
Подскажи, dwBrightness - это какой по счету байт в структуре получается?
31 Андрюха
 
18.10.11
11:22
Да не извращайся ты с DllCall напиши приложение, которому параметрами в коммандной строке будешь передавать значения Яркости и Контраста или явно или +/- для увеличения/уменьшения текущего значения
32 Андрюха
 
18.10.11
11:24
например:
dispset.exe 150 80
dispset.exe +10 +0
33 popcorn
 
18.10.11
11:27
(32) У меня под рукой нет компиляторов, да и не хочется лишних файлов иметь, лучше чтобы всё в одном скрипте работало
34 H A D G E H O G s
 
18.10.11
11:28
(31) Как получить ТЕКУЩЕЕ ЗНАЧЕНИЕ?
35 H A D G E H O G s
 
18.10.11
11:30
ChangeDisplaySettingsEx() нашел
GetDisplaySettingsEx() - не нашел, может и есть в dll

Есть еще EnumDisplaySettingsEx() - но там не то.

Надо посмотреть, какие еще функции экспортирует User32.dll
36 Андрюха
 
18.10.11
11:31
37 Андрюха
 
18.10.11
11:42
Еще упоминают про DeviceIoControl с кодом IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS
38 popcorn
 
18.10.11
11:43
(37) Эта хрень у меня не работает, пробовал. Говорят что она на ХР работала, но и то не всегда.
39 Андрюха
 
18.10.11
11:47
(38) На Win7 пробуешь?
40 popcorn
 
18.10.11
12:38
(39) да
41 popcorn
 
18.10.11
13:04
Оказывается возвращает ошибку DISP_CHANGE_BADPARAM. Подскажите смещение параметра dwBrightness в структуре. Или сколько байт занимает первая строка AGuid ?
42 popcorn
 
19.10.11
06:59
Оказывается AGuid - это нифига не строка длинной 38 байт, а просто 16 байт! Блин!
43 popcorn
 
19.10.11
07:16
Исправил, ошибку не выдает, но и результата никакого нет, яркость не меняется
44 H A D G E H O G s
 
19.10.11
11:26
Вот как то так :-)
http://zalil.ru/31894367
45 H A D G E H O G s
 
19.10.11
11:26
Примитивно, без контроля ошибок.