做pInvoke并且无法获得正确的hDC

时间:2010-08-24 04:30:15

标签: .net winapi gdi+ pinvoke

所以我试图获得正确的设备上下文,这样我就可以在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为null,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 个答案:

答案 0 :(得分:3)

使用设备名称“DISPLAY”可以获得整个显示系统的DC,因此设置伽马斜坡(对于您的示例)会影响系统中的所有显示。

您可以通过调用EnumDisplayMonitors为每个监视器检索HMONITOR来获取单个监视器的设备名称,然后为每个监视器GetMonitorInfo结构MONITORINFOEX HMONITOR 1}}。 MONITORINFOEX包含szDevice成员,您传递给GetDC以获取专门用于(卡片驱动)监视器的DC,并为其设置伽马斜坡。

请注意,这实际上会为您提供显示器所连接的图形卡的设备名称。如果存储器服务,使用较旧的硬件和/或软件,连接到同一卡的两个监视器总是卡在相同的伽马斜坡等处。使用当前的硬件/软件,带有两个显示器的单个卡将看起来像两个卡(在名称的末尾有一个“:0”或“:1”,如果内存服务),所以即使两个显示器连接到同一个物理卡,从设置伽马斜坡的角度来看,它仍被视为两个独立的监视器)。另外,我不确定需要多大的硬件和/或软件来处理将多个显示器作为多个虚拟卡驱动的单个物理卡。