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