WPF和Windows平铺

时间:2010-04-10 08:50:19

标签: c# wpf windows

我有一个WPF应用程序,它总是在Windows 7上运行,它会打开并以全屏模式显示

WPF应用中有一个按钮可以打开Word

我希望WPF应用程序在打开Word时向操作系统发送一个命令,以便它并排瓦片WPF应用程序和Word应用程序窗口,这样它们每个都占用屏幕的50%。这可能吗?如果是,是否有人知道代码可能是什么? (有点像右键单击Windows 7任务栏并单击“并排显示Windows”)

3 个答案:

答案 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 =无