在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秒左右,如果可能的话,我想避免它。
我现在的想法是创建一个钩子,但我不确定要抓什么钩子,也不知道它是否会工作。
提示吗?
所需的进程窗口样式(实际上映射到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上玩得很开心,所以我想到了这个