Размер и местоположение окна Windows Get и Move для всех активных приложений / процессов - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь написать консольное приложение, которое будет определять размеры и расположение всех окон приложения в настройке нескольких мониторов.

Я могу сделать это для приложений, у которых открыто только одно окно, но если для каждого приложения открыто несколько окон (например, Chrome или Excel с более чем одним открытым файлом), оно возвращает только 1 запись / окно для каждый из этих процессов.

Я могу получить все дочерние процессы (я сделал это, но мой код для этого не включен), но это дает мне каждый процесс, поэтому для Chrome, если у меня открыто 100 вкладок, но только 4 окна, я получаю 100 процессов вернулся, когда я хочу только один для каждого окна.

Мне нужно иметь возможность получить WindowHandle для всех открытых окон, чтобы я мог использовать его для определения размеров и местоположения окна. Ниже приведены примеры значений, которые я получаю из моих открытых окон (см. Код ниже). Это просто распечатка моего кода, который отображает эти значения.

Моя цель - запустить приложение, чтобы получить все открытые окна, их расположение / размеры и сохранить их. Затем запустите другое приложение и переместите все окна в их ранее сохраненные местоположения и размеры.

У меня есть код, который получит местоположение, а затем переместит окно в сохраненное / жестко запрограммированное место (я провел это тестирование с использованием 1 приложения, жестко запрограммированного), и оно работает. Я не программировал эту часть дальше, так как я не могу получить все окна для приложений, которые имеют несколько окон для каждого процесса.

Ваша помощь приветствуется.

WindowPosistionChange.vshost - LEFT: 64 - RIGHT: 1057 - TOP: 64 - BOTTOM: 583 - WIDTH: 993 - HEIGHT: -519
devenv - LEFT: -7 - RIGHT: 1927 - TOP: -7 - BOTTOM: 1054 - WIDTH: 1934 - HEIGHT: -1061
notepad++ - LEFT: -25600 - RIGHT: -25472 - TOP: -25600 - BOTTOM: -25573 - WIDTH: 128 - HEIGHT: -27
Teams - LEFT: -32000 - RIGHT: -31840 - TOP: -32000 - BOTTOM: -31966 - WIDTH: 160 - HEIGHT: -34
devenv - LEFT: -7 - RIGHT: 1927 - TOP: -7 - BOTTOM: 1054 - WIDTH: 1934 - HEIGHT: -1061
SnippingTool - LEFT: -32000 - RIGHT: -31840 - TOP: -32000 - BOTTOM: -31966 - WIDTH: 160 - HEIGHT: -34
EXCEL - LEFT: -25600 - RIGHT: -25472 - TOP: -25600 - BOTTOM: -25573 - WIDTH: 128 - HEIGHT: -27
mstsc - LEFT: -32000 - RIGHT: -31840 - TOP: -32000 - BOTTOM: -31966 - WIDTH: 160 - HEIGHT: -34
chrome - LEFT: 1912 - RIGHT: 3848 - TOP: -12 - BOTTOM: 1054 - WIDTH: 1936 - HEIGHT: -1066
OUTLOOK - LEFT: 1913 - RIGHT: 3847 - TOP: -11 - BOTTOM: 1054 - WIDTH: 1934 - HEIGHT: -1065

Это мой код для моего приложения

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Drawing; // for POINT need to add reference from references
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;   // to get all the processes


// had to add reference for System.Windows.Forms in references in project
namespace WindowPosistionChange
{
    class Program
    {

        static void Main(string[] args)
        {
            Process[] processes = Process.GetProcesses(".");

            foreach (var process in processes)
            {
                if (String.IsNullOrEmpty(process.MainWindowTitle) == false)
                {

                    IntPtr h1 = process.MainWindowHandle;
                    Screen scrn = Screen.FromHandle(h1);
                    WINDOWINFO winfo = new WINDOWINFO();

                    GetWindowInfo(h1, ref winfo);

                    string LineOutput = process.ProcessName + "  " + process.MainWindowTitle + " - LEFT: " + winfo.rcWindow.Left.ToString() + "" +
                            " - RIGHT: " + winfo.rcWindow.Right.ToString() + "" +
                            " - TOP: " + winfo.rcWindow.Top.ToString() + "" +
                            " - BOTTOM: " + winfo.rcWindow.Bottom.ToString() + "" +
                            " - WIDTH: " + (winfo.rcWindow.Right - winfo.rcWindow.Left).ToString() + "" +
                            " - HEIGHT: " + (winfo.rcWindow.Top - winfo.rcWindow.Bottom).ToString() + "";

                    Console.WriteLine(LineOutput);

                    // I am able to set window possistion as well by using this where h1 is the process.MainWindowHandle
                    //SetWindowPos(h1, 0, -1920, 0, 1920, 1080, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);

                }// end if for title window null

            }// end for each loop

        }// end Main APP



        //********************************************************************************************************************************
        //********************************************************************************************************************************
        //********************************************************************************************************************************

        // for windows posision?
        const short SWP_NOMOVE = 0X2;
        const short SWP_NOSIZE = 1;
        const short SWP_NOZORDER = 0X4;
        const int SWP_SHOWWINDOW = 0x0040;

        //  WINDOW DLLs import and function generation
        [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
        public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

        [DllImport("user32.dll")]
        public extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        [DllImport("user32.dll")]
        public static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi);

        public struct WINDOWINFO
        {
            public uint cbSize;
            public RECT rcWindow; //holds the coords of the window
            public RECT rcClient;
            public uint dwStyle;
            public uint dwExStyle;
            public uint dwWindowStatus;
            public uint cxWindowBorders;
            public uint cyWindowBorders;
            public ushort atomWindowType;
            public ushort wCreatorVersion;
        }

        //this holds the coordinates
        public struct RECT
        {
            public int Left;    // Specifies the x-coordinate of the upper-left corner of the rectangle. 
            public int Top;        // Specifies the y-coordinate of the upper-left corner of the rectangle. 
            public int Right;    // Specifies the x-coordinate of the lower-right corner of the rectangle.
            public int Bottom;    // Specifies the y-coordinate of the lower-right corner of the rectangle. 

        }


    }// end ProgramClass
}// end namespae
...