【问题标题】:Stop a process from showing a window from C#停止进程从 C# 显示窗口
【发布时间】:2011-04-20 02:00:14
【问题描述】:

我正在尝试自动化一个应用程序,该应用程序在启动时创建一个没有用户交互的 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 秒左右,如果可能的话,我想避免它。

我目前的想法是创建hook,但不确定要抓住什么钩子,也不知道它是否会起作用。

有什么建议吗?

【问题讨论】:

标签: c# winapi process pinvoke win32-process


【解决方案1】:

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

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

【讨论】:

  • 这让我走上了正轨,但变得更复杂了:SetThreadDesktop 不会传递到新进程,但 CreateProcess 的本机 Win32 API 的 STARTINFO 确实有一个用于桌面的字段姓名。将用所需的东西更新答案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      希望对您有所帮助,谢谢。

      【讨论】:

        【解决方案5】:

        您能否在整个表单区域的桌面内容中覆盖表单 Paint 和 blit 以超过第 16 秒?

        我对低级获胜形式的东西比较陌生,但我最近只是在玩 OnPaint,所以我想到了这个。

        【讨论】:

          猜你喜欢
          • 2012-07-17
          • 1970-01-01
          • 2012-08-09
          • 2010-12-04
          • 1970-01-01
          • 2017-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多