Установка размера и местоположения окна процесса перед process.start ()

Я использую форму для запуска новых процессов flash, используя Process.start () и MoveWindow () для изменения размера и расположения окна процесса. Проблема в том, что перед вызовом MoveWindow () вы можете увидеть окно в его размере и местоположении по умолчанию на долю секунды. Я хочу знать, есть ли способ установить расположение и размер окна до начала фактического процесса.

Process flash = new Process();
flash.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
flash.StartInfo.FileName = "C:\\RED\\bin\\android.swf";
flash.Start();
Thread.Sleep(300);
mainForm.MoveWindow(flash.MainWindowHandle, posX, 0, 1920, 1080, true);

person Miguel Sato    schedule 27.05.2015    source источник
comment
Исходный размер окна можно было откуда-то взять. В противном случае единственный вариант - поступить так, как вы. Совет: попробуйте показать свернутое окно и вместе восстановить / переместить.   -  person Sinatr    schedule 27.05.2015
comment
Ваш совет частично сработал, я использую 2 экрана и хочу воспроизвести вспышку на каждом экране. Использование свернутого окна и их восстановления приводит к тому, что окно всегда появляется на основном экране.   -  person Miguel Sato    schedule 27.05.2015


Ответы (2)


Используйте CreateProcess. У меня была такая же потребность в создании другого процесса с этой позицией.

Я определил PInvoke, как показано ниже.

public class Kernel32
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct STARTUPINFO
    {
        public uint cb;
        public string lpReserved;
        public string lpDesktop;
        public string lpTitle;
        public uint dwX;
        public uint dwY;
        public uint dwXSize;
        public uint dwYSize;
        public uint dwXCountChars;
        public uint dwYCountChars;
        public uint dwFillAttribute;
        public uint dwFlags;
        public short wShowWindow;
        public short cbReserved2;
        public IntPtr lpReserved2;
        public IntPtr hStdInput;
        public IntPtr hStdOutput;
        public IntPtr hStdError;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct PROCESS_INFORMATION
    {
        public IntPtr hProcess;
        public IntPtr hThread;
        public int dwProcessId;
        public int dwThreadId;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SECURITY_ATTRIBUTES
    {
        public int nLength;
        public IntPtr lpSecurityDescriptor;
        public int bInheritHandle;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct STARTUPINFOEX
    {
        public STARTUPINFO StartupInfo;
        public IntPtr lpAttributeList;
    }

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern bool CreateProcess(
       string lpApplicationName,
       string lpCommandLine,
       ref SECURITY_ATTRIBUTES lpProcessAttributes,
       ref SECURITY_ATTRIBUTES lpThreadAttributes,
       bool bInheritHandles,
       uint dwCreationFlags,
       IntPtr lpEnvironment,
       string lpCurrentDirectory,
       [In] ref STARTUPINFO lpStartupInfo,
       out PROCESS_INFORMATION lpProcessInformation);
}

И используйте его, как показано ниже.

const uint NORMAL_PRIORITY_CLASS = 0x0020;
const uint CREATE_UNICODE_ENVIRONMENT = 0x0400;
const uint STARTF_USESHOWWINDOW = 0x0001;
var pInfo = new Kernel32.PROCESS_INFORMATION();
var sInfo = new Kernel32.STARTUPINFO();
sInfo.dwX = (uint)hostingApp.X; // X Position 
sInfo.dwY = (uint)hostingApp.Y; // Y Position 
sInfo.dwXSize = (uint)hostingApp.Width; // Width
sInfo.dwYSize = (uint)hostingApp.Height; // Height
sInfo.dwFlags = STARTF_USESHOWWINDOW;
var pSec = new Kernel32.SECURITY_ATTRIBUTES();
var tSec = new Kernel32.SECURITY_ATTRIBUTES();
pSec.nLength = System.Runtime.InteropServices.Marshal.SizeOf(pSec);
tSec.nLength = System.Runtime.InteropServices.Marshal.SizeOf(tSec);

    var create_result = Kernel32.CreateProcess(
        fileName,                   // lpApplicationName
        " " + arguments,            // lpCommandLine
        ref pSec,                   // lpProcessAttributes
        ref tSec,                   // lpThreadAttributes
        false,                      // bInheritHandles
        NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT,      // dwCreationFlags
        IntPtr.Zero,                // lpEnvironment
        null,                       // lpCurrentDirectory
        ref sInfo,                  // lpStartupInfo
        out pInfo);                 // lpProcessInformation


    var process = Process.GetProcessById(pInfo.dwProcessId);

Надеюсь это поможет.

person Jun Hee Lee    schedule 25.05.2017
comment
Я попытался использовать вариант этого примера, но запущенное приложение (Блокнот) не прослушивало размеры XY, установленные в структуре STARTUPINFO. Если бы я НЕ устанавливал значение dwFlags, Блокнот отображался нормально. Если бы я установил для параметра dwFlags значение STARTF_USESHOWWINDOW, Блокнот вообще не отображался бы и не был на панели задач (хотя я смог распечатать его идентификатор процесса). В документе MSDN говорится, что размеры будут использоваться при первом вызове приложения CreateWindow, но Блокнот игнорирует мои настройки размера. - person Kevin; 20.04.2021

Посмотрите на ProcessStartInfo. WindowStyle. У вас должна быть возможность установить его как Hidden, пока вы не переместите и не измените его размер, а затем вернете его в нормальное состояние.

См. здесь:

Стиль скрытого окна. Окно может быть видимым или скрытым. Система отображает скрытое окно, не отрисовывая его. Если окно скрыто, оно фактически отключено. Скрытое окно может обрабатывать сообщения из системы или из других окон, но не может обрабатывать ввод от пользователя или вывод на дисплей. Часто приложение может скрывать новое окно, пока оно настраивает внешний вид окна, а затем сделать его стиль нормальным. Чтобы использовать ProcessWindowStyle.Hidden, свойство ProcessStartInfo.UseShellExecute должно иметь значение false.

О том, как изменить стиль после запуска процесса, см. В этом вопросе:

Переключить Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden во время выполнения

person Matt Burland    schedule 27.05.2015
comment
Я пытаюсь использовать ProcessWindowStyle.Hidden, но проблема в том, что скрытые окна не имеют дескриптора (ни фактического окна), поэтому я не могу изменить его размер. - person Miguel Sato; 27.05.2015