在c#中停止进程显示窗口

本文关键字:进程 显示 窗口 | 更新日期: 2023-09-27 17:50:42

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

我现在的想法是创建一个钩子,但我不确定要抓什么钩子,也不知道它是否会工作。

提示吗?

在c#中停止进程显示窗口

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

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

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

尝试选项1UseShellExecute =true, WindowStyle = ProcessWindowStyle。隐藏的或者不设置UseShellExecute(默认为true)

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

    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?
    }

希望对你有帮助,谢谢。

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

我是一个低级的win表单的新手,但是我最近在OnPaint上玩得很开心,所以我想到了这个