Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Отображение нескольких окон на несколько мониторов

#c_sharp #wpf


При запуске приложения необходимо отобразить на 3 монитора - 3 разных окна.
монитор А > окно А
монитор Б > окно Б
монитор В > окно В
Примерно так.

Каким образом это можно реализовать на C# и WPF?
    


Ответы

Ответ 1



Вот вариант БЕЗ WinForms. ScreenInformation.cs namespace MultiScreen { public class ScreenInformation { [StructLayout(LayoutKind.Sequential)] public struct ScreenRect { public int left; public int top; public int right; public int bottom; } [DllImport("user32")] private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lpRect, MonitorEnumProc callback, int dwData); private delegate bool MonitorEnumProc(IntPtr hDesktop, IntPtr hdc, ref ScreenRect pRect, int dwData); public class WpfScreen { public WpfScreen(ScreenRect prect) { metrics = prect; } public ScreenRect metrics; } static LinkedList allScreens = new LinkedList(); public static LinkedList GetAllScreens() { ScreenInformation.GetMonitorCount(); return allScreens; } public static int GetMonitorCount() { allScreens.Clear(); int monCount = 0; MonitorEnumProc callback = (IntPtr hDesktop, IntPtr hdc, ref ScreenRect prect, int d) => { Console.WriteLine("Left {0}", prect.left); Console.WriteLine("Right {0}", prect.right); Console.WriteLine("Top {0}", prect.top); Console.WriteLine("Bottom {0}", prect.bottom); allScreens.AddLast(new WpfScreen(prect)); return ++monCount > 0; }; if (EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, callback, 0)) Console.WriteLine("You have {0} monitors", monCount); else Console.WriteLine("An error occured while enumerating monitors"); return monCount; } } } App.xaml.cs namespace MultiScreen { /// /// Interaction logic for App.xaml /// public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); LinkedList screens = ScreenInformation.GetAllScreens(); foreach (var screen in screens) { var window = new MainWindow(); Console.WriteLine("Metrics {0} {1}", screen.metrics.top, screen.metrics.left); window.Top = screen.metrics.top; window.Left = screen.metrics.left; window.Show(); } } } }

Ответ 2



Можно использовать System.Windows.Forms.Screen класс, для того что бы определить кол-во мониторов и их параметры, и распределить окна по мониторам. foreach (var screen in Screen.AllScreens) { var window = new MyWindow(); var workingArea = screen.WorkingArea; window.Top = workingArea.Top; window.Left = workingArea.Left; window.Show(); } Таким образом откроется по окну на каждом мониторе.

Комментариев нет:

Отправить комментарий