C# 使用多个月获取整个屏幕的DeviceContext

C# 使用多个月获取整个屏幕的DeviceContext,c#,pinvoke,gdi,multiple-monitors,C#,Pinvoke,Gdi,Multiple Monitors,我需要(用鼠标)用C#在所有东西上画一条线。我可以使用P/Invoke获取桌面窗口的图形对象: DesktopGraphics=Graphics.FromHdc(GetDC(IntPtr.Zero)) 但是,我使用此图形对象绘制的任何内容仅显示在左侧监视器上,而在右侧监视器上没有显示任何内容。它没有失败或其他什么,只是没有表现出来 创建图形对象后,它显示的可见剪辑区域为1680 x 1050,这是我的左监视器的分辨率。我只能假设它只获取左监视器的设备上下文。它们是获取两个(或任意数量)监视器的设

我需要(用鼠标)用C#在所有东西上画一条线。我可以使用P/Invoke获取桌面窗口的图形对象:

DesktopGraphics=Graphics.FromHdc(GetDC(IntPtr.Zero))

但是,我使用此图形对象绘制的任何内容仅显示在左侧监视器上,而在右侧监视器上没有显示任何内容。它没有失败或其他什么,只是没有表现出来

创建图形对象后,它显示的可见剪辑区域为1680 x 1050,这是我的左监视器的分辨率。我只能假设它只获取左监视器的设备上下文。它们是获取两个(或任意数量)监视器的设备上下文的一种方法吗


编辑2009年3月7日: 有关我使用的修复程序的其他信息。

我使用了colithium提供的修复程序,生成了以下代码,用于为每个监视器创建图形对象,以及存储偏移量的方法,以便将全局鼠标点转换为图形表面上的有效点

private void InitializeGraphics()
{
    // Create graphics for each display using compatibility mode
    CompatibilitySurfaces = Screen.AllScreens.Select(s => new CompatibilitySurface()
        {
            SurfaceGraphics = Graphics.FromHdc(CreateDC(null, s.DeviceName, null, IntPtr.Zero)),
            Offset = new Size(s.Bounds.Location)
        }).ToArray();
}

private class CompatibilitySurface : IDisposable
{
    public Graphics SurfaceGraphics = null;
    public Size Offset = default(Size);

    public PointF[] OffsetPoints(PointF[] Points)
    {
        return Points.Select(p => PointF.Subtract(p, Offset)).ToArray();
    }

    public void Dispose()
    {
        if (SurfaceGraphics != null)
            SurfaceGraphics.Dispose();
    }
}

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

以下URL获取EnumDisplayMonitor可能会解决您的问题

要检索有关所有显示监视器的信息,请使用以下代码:

EnumDisplayMonitors(NULL,NULL,MyInfoEnumProc,0);在中提供了另一个URL

是指向另一个有同样问题的人的链接。通过拨打以下电话解决了问题:

CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)

这将向所有监视器返回一个DC。

您的回答也正确。我使用EnumDisplayMonitors获取设备名称,然后将其交给CreateDC。谢谢好吧,现在,这真的很奇怪。您的代码适用于FillRectangle(),但不适用于DrawString和SurfaceGraphics对象的其他方法。DrawString始终在主显示器上绘制,不显示我使用的SurfaceGraphics,但FillRectangle的行为正确:|