如何检查Excel应用程序是否已完全加载

时间:2018-11-29 16:15:24

标签: c# excel marshalbyrefobject

我正在使用当前代码检查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来完成该工作,但尚未实现。

谢谢您的时间。

0 个答案:

没有答案