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