在.NET中使进程窗口可见/不可见

3

我有一个应用程序,在其中我正在启动一个新进程。但是我需要调整进程中的窗口大小以适应我的要求。但是首先,该进程以正常大小打开窗口,然后我将其调整为适合大小。这使它看起来很奇怪。那么我可以在窗口处于不可见模式下启动进程,然后调整大小,然后使其可见吗?

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

你是在谈论Windows窗体还是Windows服务?你说的是服务,但服务通常不包含用户界面。 - BentOnCoding
也许更好的做法是让myApp.exe接受一些命令行参数并自动调整大小-无需等待,没有奇怪的外观。 - Yahia
1
顺便提一下,Thread.Sleep(2000) 让我感到不舒服。你有办法测试窗口是否已加载并循环直到完成吗? - Hand-E-Food
@Robotsushi:我说的是进程。它只是一个像IE或记事本一样的可执行文件。 - Vishal
2
我理解你的意思,但是你如何保证程序在2秒内加载完成呢?不过,这是一个独立的问题,我已经离题了。 - Hand-E-Food
显示剩余2条评论
3个回答

4

在调用 .Start() 之前尝试使用 startInfo.WindowStyle = ProcessWindowStyle.Hidden; 来隐藏窗口?然后再使用您的代码来显示它?

像这样:

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);

这听起来是一个合乎逻辑的解决方案。但是系统在ShowWindow中抛出了一个异常。无法弄清楚原因。 - Vishal
什么是异常?尝试这个 ShowWindow(MyApp.MainWindowHandle, 1); 这应该适用于第一次显示的窗口...这里是其他 nCmdShow 值的剩余部分,请尝试一些:http://msdn.microsoft.com/en-us/library/ms633548(v=vs.85).aspx - Cipi
是的,我尝试过了。我不知道它是否与ProcessStartInfo有关,MSN网站上提到了startupinfo,但我无法理解这个。 - Vishal
2
根据http://msdn.microsoft.com/en-us/library/ms633548%28v=vs.85%29.aspx,为了避免不稳定的结果,您应该使用`ShowWindowAsync`来处理您不拥有的Windows。 - Yahia
非常感谢@Yahia,你必须在下面写答案。很幸运我在这里看到了。 - Leandro Bardelli
显示剩余3条评论

1

0

考虑到您正在使用一个面板来加载您的进程.. 您可以使用这行代码

 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接