获取具有多个监视器的整个屏幕的设备上下文

时间:2009-02-23 03:56:05

标签: c# pinvoke gdi multiple-monitors

我需要用C#画一条线(用鼠标)。我可以使用P / Invoke获取桌面窗口的Graphics对象:

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

但是,我使用此图形对象绘制的任何内容仅显示在左侧监视器上,而右侧监视器上没有任何内容。它没有失败或任何东西,它只是没有显示。

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


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

我使用了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);

2 个答案:

答案 0 :(得分:2)

Here是指向另一个遇到同样问题的人的链接。通过致电:

解决了这个问题
CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)

将向所有监视器返回DC。

答案 1 :(得分:0)

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

MSDN

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

EnumDisplayMonitors(NULL,NULL,MyInfoEnumProc,0);还有一个URL给出了  MSJ