делает pInvoke и не может получить правильный hDC - PullRequest
1 голос
/ 24 августа 2010

Таким образом, я пытаюсь получить правильный контекст устройства, чтобы я мог установить гамму на отдельных мониторах в конфигурации N мониторов (2+).

Я пробовал

[DllImport("gdi32.dll")]
static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);

С помощью этого метода я использую строку «DISPLAY» для lpszDriver, я перечисляю отображения с помощью другого метода pInvoke и получаю имя устройства отображения, которое в итоге выглядит как «\ Registry \ Machine \ System \ CurrentControlSet \ Control \ Class {4d36e96e-e325-11ce-bfc1-08002be10318} \ 0042 "и передается как lpszDevice. Значение lpszOutput равно нулю, а lpInitData равно IntPtr.Zero. Возвращаемый hDC работает, но кажется глобальным.

и

[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr hWnd);

С помощью этого метода я попытался использовать настоящий дескриптор формы окна.

Я использую

[DllImport("gdi32.dll")]
private static extern int SetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp);

Он устанавливает гамма-шкалу, но он всегда устанавливает оба монитора. Есть идеи?

1 Ответ

3 голосов
/ 24 августа 2010

Использование имени устройства «DISPLAY» дает вам постоянный ток для всей системы отображения, поэтому настройка гамма-шкалы (для вашего примера) влияет на все дисплеи в системе.

Вы можете получить имя устройства для отдельного монитора, вызвав EnumDisplayMonitors, чтобы получить HMONITOR для каждого монитора, затем GetMonitorInfo со структурой MONITORINFOEX для каждого HMONITOR. В MONITORINFOEX содержится элемент szDevice, который вы передаете GetDC, чтобы получить DC специально для (управления картой) этого монитора и установить для него гамма-шкалу.

Обратите внимание, что на самом деле вы получаете имя устройства для видеокарты, к которой подключен монитор. Если память используется, на более старом оборудовании и / или программном обеспечении два монитора, подключенные к одной и той же карте, всегда были привязаны к одной и той же гамме-рампе и тому подобное. При текущем оборудовании / программном обеспечении одна карта с двумя мониторами будет выглядеть в системе как две карты (с чем-то вроде «: 0» или «: 1» в конце имени, если память служит), так что даже если два монитора подключены к одной и той же физической карте, с точки зрения настройки гамма-характеристики, она все еще рассматривается как два отдельных). Случайно, я не уверен, насколько точно требуется новое аппаратное и / или программное обеспечение для обработки одной физической карты с несколькими мониторами как нескольких виртуальных карт.

...