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

Ale*_*man 3 c# pinvoke winapi process win32-process

我正在尝试自动化在启动时创建GUI窗口但没有用户交互的应用程序,但我无法弄清楚如何隐藏实际窗口.

我尝试过使用ProcessStartInfo:

Process.Start(new ProcessStartInfo {
    UseShellExecute = false,
    CreateNoWindow = true,
    WindowStyle = ProcessWindowStyle.Hidden,

    // other properties here
});
Run Code Online (Sandbox Code Playgroud)

但窗口仍然显示出来.

我也试过旋转等待窗口存在,然后隐藏它:

while (process.MainWindowHandle == IntPtr.Zero) {}
ShowWindowAsync(process.MainWindowHandle, SW_HIDE);
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这使得窗口闪烁大约1/16秒左右,如果可能的话,我想避免使用它.

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

有小费吗?

Jef*_*tin 6

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

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