C# - Несколько приложений для рабочего стола - Проблемы с логикой
Я в настоящее время рву волосы с этой проблемой.
Где я до:
Я могу
- Создать изображение для каждого экрана
- Создайте мега-изображение для двух экранов рядом друг с другом.
- Установка этого в качестве плиточных обоев.
Что я хочу сделать:
- Поддержка любого количества мониторов
- Поддержка всех смещений мониторов, таких как мониторы выше или ниже или диагональные.
Я прочитал эту статью MSDN и нашел ее очень полезной:
http://blogs.msdn.com/b/oldnewthing/archive/2007/09/24/5083738.aspx
Но я все еще застрял в логике, которую мне нужно использовать для:
- Рассчитайте, какой размер изображения мне нужен для любого варианта мониторов
- Создайте обои, применяя смещение мониторов
Моя программа выложена следующим образом:
Класс ScreenInfo:
public Bitmap ChosenWallPaper { get; private set; }
public Rectangle ScreenArea { get; private set; }
int ScreenNumber { get; set; }
public string ScreenDescription { get { return "Screen: " + ScreenNumber + " " + ScreenArea.ToString(); } }
public ScreenInfo(int screenNumber)
{
this.ScreenNumber = screenNumber;
ScreenArea = new Rectangle(Screen.AllScreens[screenNumber].Bounds.X, Screen.AllScreens[screenNumber].Bounds.Y, Screen.AllScreens[screenNumber].Bounds.Width, Screen.AllScreens[screenNumber].Bounds.Height);
}
Класс ScreenCollection
public List<ScreenInfo> ScreenList { get; private set; }
public ScreenCollection()
{
ScreenList = new List<ScreenInfo>();
for (int i = 0; i < Screen.AllScreens.Count(); i++)
{
ScreenList.Add(new ScreenInfo(i));
}
}
public Rectangle CalculateMainBitmapSize()
{
}
Остальная часть моего исходного кода еще не была реализована.
Спасибо!
РЕДАКТИРОВАТЬ:
Я выяснил, как представлять два монитора друг с другом ДЕЙСТВИТЕЛЬНО хакерским, ужасным кодом, но я начинаю понимать, как мониторы расположены немного больше...
private void SizeScreens()
{
pictureBox1.Height = Desktops.ScreenList[0].ScreenArea.Height / 10;
pictureBox1.Width = Desktops.ScreenList[0].ScreenArea.Width / 10;
pictureBox2.Height = Desktops.ScreenList[1].ScreenArea.Height / 10;
pictureBox2.Width = Desktops.ScreenList[1].ScreenArea.Width / 10;
}
private void PositionScreens()
{
Point Screen1Location = new Point(Desktops.ScreenList[0].ScreenArea.X,Desktops.ScreenList[0].ScreenArea.Y);
Point Screen2Location = new Point(Origin.X + (Desktops.ScreenList[1].ScreenArea.X / 10),Origin.Y + (Desktops.ScreenList[1].ScreenArea.Y / 10));
pictureBox1.Location = Origin;
pictureBox2.Location = Screen2Location;
}
1 ответ
Вы можете запросить размер виртуального экрана, используя функцию GetSystemMetrics с параметрами SM_CXVIRTUALSCREEN
а также SM_CYVIRTUALSCREEN
, Это должно дать вам размер вашего изображения.
Позиции мониторов можно получить через "EnumDisplayMonitors", но это немного сложнее, так как для этого требуется функция обратного вызова.
// редактировать: не знал Screen.AllScreens
, но я думаю, вы получаете позиции экранов там.
Вы должны просто поставить обои на эти позиции, оборачивая экраны с отрицательными координатами вправо. Источник виртуального экрана находится в верхнем левом углу основного монитора.