【问题标题】:doing pInvoke and can't get the right hDC执行 pInvoke 并且无法获得正确的 hDC
【发布时间】:2010-08-24 04:30:15
【问题描述】:

因此,我正在尝试获取正确的设备上下文,以便可以在 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);

它确实设置了伽马斜坡,但它总是设置两个显示器。 有什么想法吗?

【问题讨论】:

    标签: .net winapi gdi+ pinvoke


    【解决方案1】:

    使用设备名称“DISPLAY”将为您提供整个显示系统的 DC,因此设置伽马斜坡(以您的示例为例)会影响系统中的所有显示器。

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

    请注意,这实际上会为您获取连接显示器的显卡的设备名称。如果内存服务,使用较旧的硬件和/或软件,连接到同一张卡的两台显示器总是卡在相同的伽马斜坡等。使用当前的硬件/软件,带有两个显示器的单卡在系统中看起来就像两张卡(如果有记忆的话,名称末尾会带有“:0”或“:1”之类的东西),所以即使两个显示器连接到同一个物理卡上,从设置伽马斜坡的角度来看,它仍然被视为两个独立的)。顺便说一句,我不确定需要多少新的硬件和/或软件才能将驱动多个显示器的单个物理卡视为多个虚拟卡。

    【讨论】:

    • 感谢您的回复,我正在努力解决这个问题。一件奇怪的事情是我得到了空白的 szDevice 名称。我实际上正在使用互操作在 .net 中工作。
    • 你也不需要调用 CreateDC 吗? GetDC 仅将 hWnd 作为参数,而 szDevice 是名称?
    • 解决了我的空名称问题,这是我的愚蠢错误。非常感谢。
    • 这也是您可以从 windows.forms.screens.allscreens 获得的相同名称
    • 糟糕——是的,它应该是 CreateDC,而不是 GetDC。至于空白 szDevice 名称,我不确定——我得到的名称类似于“\\.\DISPLAY1”(使用 Windows 7 x64)。 OTOH,我正在编写本机代码——使用 P/Invoke 可能会出现问题(恐怕我不能或至少不会尝试提供帮助)。
    猜你喜欢
    • 2017-04-11
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多