3

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

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

有小费吗?

4

5 回答 5

7

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

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

于 2011-04-20T02:14:49.627 回答
2

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

于 2011-04-20T02:32:35.373 回答
0

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

于 2011-04-20T02:15:35.787 回答
0

为什么不直接设置 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?
    }

希望这有帮助,谢谢。

于 2011-04-20T02:21:25.993 回答
0

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

我是低级获胜形式的相对新手,但我最近只是在玩 OnPaint,所以我想到了这一点。

于 2011-04-20T02:40:06.717 回答