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

时间:2011-04-20 02:00:15

标签: c# winapi process pinvoke win32-process

我正在尝试自动化在启动时创建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,但我不确定要抓住什么钩子,也不确定它是否会起作用。

任何提示?

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分: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?
    }

希望这有帮助,谢谢。

答案 4 :(得分:0)

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

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