在后台启动SOLIDWORKS应用程序(隐藏)
{ width=350 }
在使用独立应用程序时,有时将应用程序在后台(不可见)启动可能更有益。这种方法提供了更好的用户体验和更好的性能。
可以使用以下ProcessStartInfo来启动任何Windows进程并隐藏其主窗口:
var prcInfo = new ProcessStartInfo()
{
FileName = appPath,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
然而,对于SOLIDWORKS应用程序,这段代码可能并不总是有效。隐藏窗口的另一种方法是使用ShowWindow Windows32 API。在应用此方法之前,需要等待句柄创建并且SOLIDWORKS完全加载。
除了上述方法,启动SOLIDWORKS实例时使用/r参数也是有益的。这个参数可以隐藏启动画面并加快启动速度。对于SOLIDWORKS Professional和Premium,还可以使用/b参数在后台启动SOLIDWORKS(仍然可见)。
/b标志由SOLIDWORKS任务计划程序处理,对于不包含任务计划程序的SOLIDWORKS Standard不起作用。
下面的函数考虑了上述所有要点,并在后台启动新的SOLIDWORKS会话。将此函数与创建C#独立应用程序中的代码结合使用。
一些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;
}