2009-02-23 8 views
2

Мне нужно нарисовать линию (с помощью мыши) над всем с C#. Я могу получить объект Graphics окна рабочего стола с помощью P/Invoke:Получить DeviceContext всего экрана с несколькими монтированиями

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

Однако все, что я рисую с использованием этого графического объекта, отображается только на левом мониторе, и ничего не отображается на правом мониторе. Это не терпит неудачу или что-то еще, это просто не показывает.

После того, как я создаю объект Graphics, он показывает, что область видимого клипа будет 1680 x 1050, что является разрешением моего левого монитора. Я могу только предположить, что это только получение контекста устройства для левого монитора. Является ли их способ получить контекст устройства для обоих мониторов (или любого числа)?


EDIT 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); 
+0

Хорошо, теперь это действительно, действительно странно. Ваш код работает для FillRectangle(), но не для DrawString и других методов объекта SurfaceGraphics. DrawString всегда использует первичный дисплей, без учета того, что SurfaceGraphics я использую, но FillRectangle ведет себя правильно. : | – Cipi

ответ

2

Here является ссылкой на другого человека, имевшего такую ​​же проблему. Было решено позвонить по телефону:

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

, который вернет DC ко всем мониторам.

0

После URL, чтобы получить EnumDisplayMonitor может решить вашу проблему

MSDN

Для получения информации о всех мониторах, используйте следующий код:

EnumDisplayMonitors (NULL, NULL, MyInfoEnumProc, 0); Еще один URL-адрес, указанный в MSJ

+0

Вы тоже были правы. Я использовал EnumDisplayMonitors, чтобы получить имя устройства, которое затем передал CreateDC. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^