在某些情况下,使用独立应用程序时,在后台启动应用程序(不可见)可能会有所帮助。此方法可提供更好的用户体验和更好的性能。
任何窗口进程都可以通过使用“ProcessStartInfo”来隐藏其主窗口。(https://learn.microsoft.com/zh-cn/dotnet/api/system.diagnostics.processstartinfo)
var prcInfo = new ProcessStartInfo()
{
FileName = appPath,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
然而,对于 SOLIDWORKS 应用程序,此代码可能并不总是有效。隐藏窗口的替代方法是使用Windows32 API的ShowWindow函数(https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-showwindow)。在应用此方法之前,需要等到创建句柄(until the handle is created)并且 SOLIDWORKS 完全加载。
除此之外,在启动 SOLIDWORKS 实例时使用 /r 参数也是有益的。此参数将允许隐藏初始屏幕并加快启动速度。对于 SOLIDWORKS Professional 和 Premium,也可以使用 /b 参数在后台启动 SOLIDWORKS(仍然可见,still visible)。
/b 标志由 SOLIDWORKS 任务计划程序处理,不适用于 SOLIDWORKS 标准版,因为任务计划程序不包含在此包中。
下面的函数考虑了上述所有要点,并在后台启动了 SOLIDWORKS 的新会话。将此函数与创建 C# 独立应用程序中的代码结合使用。
某些SOLIDWORKS API 方法可能无法执行或行为不正确,因为 SOLIDWORKS 应用程序不可见。
private static ISldWorks StartSwAppBackground(string appPath, int timeoutSec = 20)
{
var timeout = TimeSpan.FromSeconds(timeoutSec);
var startTime = DateTime.Now;
var prcInfo = new ProcessStartInfo()
{
FileName = appPath,
Arguments = "/r", //no splash screen,无初始屏幕
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
var prc = Process.Start(prcInfo);
ISldWorks app = null;
var isLoaded = false;
var onIdleFunc = new DSldWorksEvents_OnIdleNotifyEventHandler(() =>
{
isLoaded = true;
return 0;
});
try
{
while (!isLoaded)
{
if (DateTime.Now - startTime > timeout)
{
throw new TimeoutException();
}
if (app == null)
{
app = GetSwAppFromProcess(prc.Id);
if (app != null)
{
(app as SldWorks).OnIdleNotify += onIdleFunc;
}
}
System.Threading.Thread.Sleep(100);
}
if (app != null)
{
const int HIDE = 0;
ShowWindow(new IntPtr(app.IFrameObject().GetHWnd()), HIDE);
}
}
catch
{
throw;
}
finally
{
if (app != null)
{
(app as SldWorks).OnIdleNotify -= onIdleFunc;
}
}
return app;
}
文章翻译自https://www.codestack.net/
仅供学习使用。