Да, это возможно и относительно легко.
Вы говорите, что у вас уже есть код, который открывает ваше окно WPF "на весь экран". Предполагая, что это действительно полноэкранное представление, а не развернутое окно, вы уже рассчитали прямоугольник экрана. Если нет, вы можете использовать класс Screen
из System.Windows.Forms
, чтобы получить прямоугольник экрана. Помните, что класс Screen
является частью WinForms, поэтому он использует координаты устройства (пиксели) вместо координат, не зависящих от разрешения (96 точек на дюйм), поэтому вам необходимо преобразовать Rectangle в Rect, а затем применить преобразование PresentationSource.FromVisual(window).TransformFromDevice
, чтобы получить Координаты WPF.
Если у вас есть экран Rect с независимыми от устройства координатами (96 точек на дюйм), вы должны вычислить отдельные прямоугольники. Например, вот вычисление для 50% горизонтального деления screenRect:
Rect rect1 = new Rect(screenRect.X, screenRect.Y, screenRect.Width/2, screenRect.Height);
Rect rect2 = new Rect(screenRect.X + screenRect.Width/2, screenRect.Y, screenRect.Width/2, screenRect.Height);
Когда у вас есть границы, вы можете просто настроить собственное окно:
window.Left = rect1.X;
window.Top = rect1.Y;
window.Width = rect1.Width;
window.Height = rect1.Height;
Перемещение окна Word немного сложнее. Вы должны преобразовать в координаты устройства, запустить процесс, дождаться инициализации Word, затем вызвать функцию Win32 SetWindowPos
. Это должно быть сделано в отдельном потоке, чтобы избежать блокировки пользовательского интерфейса.
// Transform rect2 to device coordinates
rect2.Transform(PresentationSource.FromVisual(window).TransformToDevice);
// Execute the rest of this in a separate thread
ThreadPool.QueueUserWorkItem(_ =>
{
// Start Word
var process = Process.Create(pathToWinwordExe);
// Wait for Word to initialize
process.WaitForInputIdle();
// Set the position of the main window
IntPtr hWnd = process.MainWindowHandle;
if(hWnd!=IntPtr.Zero)
SetWindowPos(
hWnd, IntPtr.Zero,
(int)rect2.X, (int)rect2.Y, (int)rect2.Width, (int)rect2.Height,
SWP_NOZORDER);
});
Не забудьте DllImport
для SetWindowPos
. Примерно так должно работать:
[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)]
public static extern bool SetWindowPos(
HandleRef hWnd, HandleRef hWndInsertAfter, int x, int y, int cx, int cy, int flags);