停止进程从C#显示一个窗口

我正在尝试自动化在启动时创建GUI窗口但没有用户交互的应用程序,但我无法弄清楚如何隐藏实际窗口。

我尝试过使用ProcessStartInfo:

Process.Start(new ProcessStartInfo { UseShellExecute = false, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, // other properties here }); 

但窗口仍然显示出来。

我也试过旋转等待窗口存在,然后隐藏它:

 while (process.MainWindowHandle == IntPtr.Zero) {} ShowWindowAsync(process.MainWindowHandle, SW_HIDE); 

遗憾的是,这使得窗口闪烁大约1/16秒左右,如果可能的话,我想避免使用它。

我目前的想法是创建一个钩子 ,但我不确定抓什么钩子,也不确定它是否会起作用。

有小费吗?

所需的进程窗口样式(实际映射到其中一个SW_常量)被传递给另一个应用程序的WinMain函数,但这并不意味着粗鲁的应用程序不会忽略您发送的任何值。

您可以使用User32.CreateDesktop创建另一个虚拟桌面来User32.CreateDesktop ,然后使用Kernel32.CreateProcess ,确保将正确的桌面名称作为STARTINFO结构的一部分STARTINFO

CreateNoWindow选项仅适用于控制台模式应用程序,您无法阻止GUI应用程序创建其主窗口。 最好的选择是WindowStyle属性,将其设置为Hidden或Minimized。 一个表现良好的GUI应用程序在调用ShowWindow()时使用它。 但它覆盖或忽略这个值肯定并不罕见。 在你的情况下,赔率并不好,最小化是你要留下来尝试的。

使用UseShellExecute = true和WindowStyle = ProcessWindowStyle.Hidden尝试选项1或不设置UseShellExecute(默认为true)

为什么不设置WinForm项目的Startup Object属性? 您可以在不显示表单或实际窗口的情况下启动该过程。

  static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // Application.Run(new Form1()); // TODO: Start you process here? } 

希望这有帮助,谢谢。

您是否可以覆盖整个表单区域的桌面内容中的表单Paint和blit,以便超过16秒?

我是低级别胜利forms的相对新手,但我最近刚刚和OnPaint一起玩,所以我想到了这一点。