Я использую следующий код, чтобы нарисовать на одном мониторе:Рисование поверх всех окон на нескольких мониторах
Point cursorLocation;
NativeMethods.GetCursorPos(out cursorLocation);
Screen screen = Screen.FromPoint(cursorLocation);
Point h1 = new Point(screen.Bounds.Left, cursorLocation.Y);
Point h2 = new Point(screen.Bounds.Right, cursorLocation.Y);
Point v1 = new Point(cursorLocation.X, screen.Bounds.Top);
Point v2 = new Point(cursorLocation.X, screen.Bounds.Bottom);
using (Graphics graphics = Graphics.FromHwnd(NativeMethods.GetDesktopWindow())) {
NativeMethods.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
graphics.DrawLine(Pens.Red, h1, h2);
graphics.DrawLine(Pens.Red, v1, v2);
}
нативно, этот должентеоретически отрисовки на любом мониторе. Однако он использует только первичный. Итак, чтобы исправить это, я получаю DC всех дисплеев и пытаюсь сделать это таким образом.
IntPtr hdc = NativeMethods.CreateDC("DISPLAY", IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
Graphics graphics = Graphics.FromHdc(hdc);
graphics.DrawLine(Pens.Red, h1, h2);
graphics.DrawLine(Pens.Red, v1, v2);
graphics.Dispose();
NativeMethods.ReleaseDC(IntPtr.Zero, hdc);
Идите, это даже не рисует на экране. Я пробовал различные перегрузки для CreateDC, а также искал SO и другие ресурсы, и я в тупике.
После того, как это решается, кто знает, как избавиться от мерцания, обновив рабочий стол с помощью SHCHangeNotify? Я рисую только две линии, и это мерцает, как сумасшедший ..)
Ваш код не компилируется как есть - ваш графический объект называется «Графика», но позже использовать его как «г». – BrainSlugs83
Graphics.FromHwnd (hdc) генерирует исключение OutOfMemoryException для меня - как для hdc, созданного из «\\. DISPLAY1», так и для всех ненулевых dcs, созданных строками, возвращаемыми EnumDisplayDevices ... – BrainSlugs83