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