我正在使用当前代码检查Excel是否正在启动。启动时,我想使用Marshal.getActiveObject()获取该应用程序。
private ManagementEventWatcher WatchForProcessStart(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceCreationEvent " +
"WITHIN 10 " +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + processName + "'";
// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";
// Create a watcher and listen for events
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessStarted;
watcher.Start();
return watcher;
}
private void ProcessStarted(object sender, EventArrivedEventArgs e)
{
var excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
if (excelApp != null)
{
// do stuff
}
}
但是,现在,Excel启动后立即触发Marshal.getActiveObject(),这意味着该应用尚未完全初始化,但导致了异常"System.Runtime.InteropServices.COMException' in mscorlib.dll".
为解决此问题,我使用System.Threading.Thread.Sleep(25000);
将程序休眠了10秒钟(足以使Excel应用程序完全加载到我的PC中)
可以,但是我想找到另一种方法,因为10秒钟的睡眠取决于硬件。
我发现的最干净的方法是检查流程应用程序是否已完全加载,我打算使用Status of Win32_Process来完成该工作,但尚未实现。
谢谢您的时间。