我正在尝试自动化在启动时创建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,但我不确定要抓住什么钩子,也不确定它是否会起作用。
任何提示?
答案 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,所以我想到了这一点。