我有一个WPF应用程序,它总是在Windows 7上运行,它会打开并以全屏模式显示
WPF应用中有一个按钮可以打开Word
我希望WPF应用程序在打开Word时向操作系统发送一个命令,以便它并排瓦片WPF应用程序和Word应用程序窗口,这样它们每个都占用屏幕的50%。这可能吗?如果是,是否有人知道代码可能是什么? (有点像右键单击Windows 7任务栏并单击“并排显示Windows”)
答案 0 :(得分:1)
是的,这是可能的并且相对容易。
您说您已经拥有可以“全屏”打开WPF窗口的代码。假设这是一个真正的“全屏”视图而不是“最大化”窗口,那么您已经计算了屏幕矩形。如果没有,您可以使用Screen
中的System.Windows.Forms
类来获取屏幕矩形。请记住,Screen
类是WinForms的一部分,因此它使用设备坐标(像素)而不是与分辨率无关的坐标(96dpi),因此您需要将Rectangle转换为Rect,然后应用{{1}转换以获取WPF坐标。
在设备无关(96dpi)坐标中设置屏幕Rect后,必须计算单独的矩形。例如,这里是screenRect的50%水平除法的计算:
PresentationSource.FromVisual(window).TransformFromDevice
一旦你有了界限,你可以简单地调整你自己的窗口:
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);
移动Word窗口稍微复杂一些。您必须转换为设备坐标,启动进程,等待Word初始化,然后调用Win32的window.Left = rect1.X;
window.Top = rect1.Y;
window.Width = rect1.Width;
window.Height = rect1.Height;
函数。这必须在单独的线程上完成,以避免阻止UI。
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);
});
的{{1}}。这样的事情应该有效:
DllImport
答案 1 :(得分:0)
这是解决这个问题的方法:
Window1 window = new Window1();
double height = SystemParameters.WorkArea.Height;
double width= SystemParameters.WorkArea.Width;
this.Height = height;
this.Width = width / 2;
this.Left = 0;
this.Top = 0;
window.Height = height;
window.Width = width / 2;
window.Left = width / 2;
window.Top = 0;
window.Show();
希望它有所帮助!!
答案 2 :(得分:0)
我尝试的另一种方法是在启动wpf应用程序中的exe程序后调用vbs文件,然后vbs文件将命令发送到系统以垂直平铺等等
dim objShell set objShell = CreateObject(“Shell.Application”) objShell.TileVertically 设置objShell =无