Сделать окно процесса видимым / невидимым в .NET - PullRequest
3 голосов
/ 27 июля 2011

У меня есть приложение, в котором я запускаю новый процесс.Но мне нужно изменить размер окна в процессе, чтобы соответствовать моему требованию.Но сначала процесс открывает окно в нормальном размере, а затем я изменяю его размер, чтобы соответствовать.Это выглядит странно.Так можно ли запустить процесс с winodw в невидимом режиме, а затем изменить его размер и сделать его видимым?

ProcessStartInfo startInfo = new ProcessStartInfo("myApp.exe");
MyApp = Process.Start(startInfo);
Thread.Sleep(2000);
MoveWindow(MyApp.MainWindowHandle, 0, 380, 2040, 1150, true);

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Пробовал startInfo.WindowStyle = ProcessWindowStyle.Hidden; перед вызовом .Start (), чтобы скрыть это?А затем использовать свой код, чтобы показать его?

Примерно так:

ProcessStartInfo startInfo = new ProcessStartInfo("myApp.exe");

startInfo.WindowStyle = ProcessWindowStyle.Hidden;

MyApp = Process.Start(startInfo);
Thread.Sleep(2000);
MoveWindow(MyApp.MainWindowHandle, 0, 380, 2040, 1150, true);

Чтобы показать окно, импортируйте этот метод:

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);

Затем вызовите его после функции MoveWindow:

ShowWindow(MyApp.MainWindowHandle, 5);
1 голос
/ 02 июня 2012

Согласно http://msdn.microsoft.com/en-us/library/ms633548%28v=vs.85%29.aspx вы должны использовать ShowWindowAsync для Windows, которой вы не владеете, чтобы избежать ошибочных результатов.

0 голосов
/ 11 декабря 2015

, учитывая, что вы используете панель, куда загружается ваш процесс .. вы можете использовать эту строку кода

 ProcessStartInfo info = new ProcessStartInfo();
 Process p = new process(); // you can also use System.Diagnostics.Process
 ProcessStartInfo info = new ProcessStartInfo();
 info.FileName = // your Process
 info.Arguments = "Your Argument";
 info.UseShellExecute = true;
 info.CreateNoWindow = true;
 info.WindowStyle = ProcessWindowStyle.Maximized; //this will make no effect, so optional
 info.RedirectStandardInput = false;
 info.RedirectStandardOutput = false;
 info.RedirectStandardError = false;
 p = System.Diagnostics.Process.Start(info);
 p.WaitForInputIdle();
 Thread.Sleep(10000);
 SetParent(p.MainWindowHandle, this.pnlAlpha.Handle);
 // You also need to use this line so that your window should be re-sized 
 MoveWindow(p.MainWindowHandle, 0, 0, yourPanel.Width, yourPanel.Height, true);


//Dont forget to add this globally 
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("USER32.dll")]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
...