【问题标题】:Is there a way to run c# forms application without showing a gui window (like a console application)有没有办法在不显示 gui 窗口的情况下运行 c# forms 应用程序(如控制台应用程序)
【发布时间】:2012-02-23 12:55:31
【问题描述】:

有没有办法在不显示 gui 窗口的情况下运行 c# forms 应用程序(如控制台应用程序)。我正在尝试将网页的屏幕短片加载到webkit.net control 中。

一切正常,我可以获取屏幕截图,但如果有一种方法可以在不显示窗口的情况下运行应用程序,那么将其包含在脚本中以自动捕获网页会更加简洁。

我尝试过:form.hide() 方法,但有些方法根本不隐藏任何东西。

【问题讨论】:

  • 您是否尝试过创建Console Application
  • 我认为他也不想要控制台。我猜他根本不想要任何弹出窗口,只是为了让它在后台运行(但不是作为服务)
  • 如果由于某种原因@L.B 的建议对您不起作用,那么您可以以最小化方式启动主窗口
  • @L.B:不幸的是,我需要先将页面渲染到表面上,然后才能捕获它。由于 Webkit.net 作为自定义控件添加到 winforms 窗口,我认为控制台应用程序不是一个选项。
  • 不幸的是,没有一个建议对我有用。这是因为,似乎 webkit.net 包装器是在假设控件在加载任何 url 之前加载到容器中(并显示)的情况下编写的。我可能可以将其解耦,但似乎工作量太大。现在,我正在调用 show, hide form inside main() 在表单上(奇怪的是,当我在表单内调用它时它不起作用)依次隐藏它(再次显示需要让 webkit.net 开心)。这会导致轻微的闪烁。

标签: c# .net winforms webpage-screenshot webkit.net


【解决方案1】:

在您的应用程序中,当您创建一个新的 WinForms 应用程序时,删除 Form1.cs 和设计器文件。

然后在 Program.cs 的 main 方法中你有以下代码:

  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(new Form1());

删除这些行,并放入您需要的内容。如果您想通过在其中添加某种循环来保持程序运行,请确保 Main 方法永远不会返回。

您还可以考虑创建一个NotifyIcon,以便您的程序将在任务栏的通知区域内显示一个通知图标。通过这种方式,您可以向通知图标添加一个菜单,以便用户通过某种方式与应用程序进行交互和关闭。

【讨论】:

  • 我认为这不是 OP 所要求的 - 我认为他想获取网页并将其直接呈现为位图而不是屏幕
【解决方案2】:

我不熟悉 webkit.net API,但您提到它提供了一个 Windows 窗体控件。有一个System.Windows.Forms.Control.DrawToBitmap,它将控件绘制为位图。并且不需要将控件放入Form中。

使用 Øyvind Knobloch-Bråthen 的方法,Main 方法示例如下所示:

static void Main()
{
    // Leave these lines here!
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    // change this in order to use the webkit control
    Control ctrl = new Button { Width = 100, Height = 23, Text = "abc" };

    using (Bitmap bitmap = new Bitmap(ctrl.Width, ctrl.Height, PixelFormat.Format32bppRgb))
    {
        ctrl.DrawToBitmap(bitmap, new Rectangle(0, 0, ctrl.Width, ctrl.Height));
        bitmap.Save("test.png");
    }
}

请注意,我使用了一个按钮 - 您应该修改它以绘制您的 webkit.net 控件。

【讨论】:

    【解决方案3】:

    我认为 API 可能不支持您在此处执行的操作。我的建议是在 WebKit 库中搜索某种无需 WinForms 控件即可制作屏幕截图的方法。

    如果您想通过这条路径找到解决方案,您可以尝试将“Program.cs”中的Application.Run(new Form1()); 替换为以下内容:

    using (Form1 form = new Form1())
    {
      form1.webKit1.DoScreenshot() // Just guessing on the API here
    }
    

    我不能保证这真的会奏效。或者它会在新的 webkit.net 未来版本中继续工作

    【讨论】:

      【解决方案4】:

      如果一个窗口在屏幕上不可见(未打开、隐藏,在屏幕外打开,甚至只是在其他东西后面)然后它根本不会渲染。

      如果 webkit 具有为您呈现到屏幕外位图的特定机制,那么您可以使用它来生成所需的图像而无需显示控件 - 或者正如 @Stephan 指出的那样,DrawToBitmap 可能会起作用。除此之外,您可能会进入在隐藏的桌面或其他黑客上运行应用程序的复杂领域。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 2013-09-26
        相关资源
        最近更新 更多