Я пытаюсь написать консольное приложение, которое будет определять размеры и расположение всех окон приложения в настройке нескольких мониторов.
Я могу сделать это для приложений, у которых открыто только одно окно, но если для каждого приложения открыто несколько окон (например, 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