3

我需要用 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);
4

2 回答 2

2

是另一个有同样问题的人的链接。通过调用以下方法解决了该问题:

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

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

于 2009-02-23T04:25:08.817 回答
0

按照 URL 获取 EnumDisplayMonitor 可能会解决您的问题

MSDN

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

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0); MSJ提供的另一个 URL

于 2009-02-23T04:07:55.520 回答