Я использую текущий код для проверки запуска 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
}
}
Однако прямо сейчас Marshal.getActiveObject () запускается сразу после запуска Excel, что означает, что приложение не полностью инициализировано, но приводит к исключению "System.Runtime.InteropServices.COMException' in mscorlib.dll".
Чтобы решить эту проблему, я перевел программу на 10 секунд (достаточно долго, чтобы приложение Excel полностью загружалось на моем компьютере) с System.Threading.Thread.Sleep(25000);
, и это работает, но я хочу найти другой способ сделать это, потому что 10-второй сон зависит от аппаратного обеспечения.
Самый простой способ, который я нашел, это проверить, загружено ли приложение процесса полностью, что я намеревался сделать с Status Win32_Process , ноон еще не реализован.
Спасибо за потраченное время.