2016-02-12 3 views
0

Я запускаю приложение Excel с использованием класса Process. Я могу получить идентификатор процесса & в главном окне окна с кодом ниже.Извлечь приложение Excel из идентификатора процесса

Process xlP = Process.Start("excel.exe"); 
    int id = xlP.Id; 
    int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle; 

Итак, это запускает приложение Excel. Как связать этот конкретный экземпляр Excel с идентификатором процесса &?

Я видел похожие вопросы здесь, но ответ был ссылкой на веб-страницу, которая больше не существует.

В основном я хочу что-то вроде ниже.

oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

Пожалуйста, не приложение Excel должен быть запущен с помощью метода Process.Start, нет, если Буц или maybes.

+1

Что случилось с GetActiveObject после Process.Start? По умолчанию будет работать только один экземпляр Excel. Если есть несколько экземпляров, вам нужно пройти таблицу ROT, получить каждый экземпляр и найти processid из App.HWND –

+0

@AlexK. Спасибо за ответ. Мы используем окна 7, и возможно, что в любое время может быть более одного экземпляра excel. Вот почему я думал, что идентификатор процесса будет полезен, но думаю, что я ошибаюсь. Извините, что таблица ROT? могу сказать, что это ново для меня – mHelpMe

+0

Просто любопытно, что вы пытаетесь сделать с открытым документом excel? – Nick

ответ

2

Вы можете использовать следующий код, чтобы получить доступ ко всем запущенные экземпляры Excel и отобразить дескриптор окна, они используют:

[DllImport("ole32.dll")] 
private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); 

private void button1_Click(object sender, EventArgs e) 
{ 
    IRunningObjectTable lRunningObjectTable = null; 
    IEnumMoniker lMonikerList = null; 

    try 
    { 
     // Query Running Object Table 
     if (GetRunningObjectTable(0, out lRunningObjectTable) != 0 || lRunningObjectTable == null) 
     { 
      return; 
     } 

     // List Monikers 
     lRunningObjectTable.EnumRunning(out lMonikerList); 

     // Start Enumeration 
     lMonikerList.Reset(); 

     // Array used for enumerating Monikers 
     IMoniker[] lMonikerContainer = new IMoniker[1]; 

     IntPtr lPointerFetchedMonikers = IntPtr.Zero; 

     // foreach Moniker 
     while (lMonikerList.Next(1, lMonikerContainer, lPointerFetchedMonikers) == 0) 
     { 
      object lComObject; 
      lRunningObjectTable.GetObject(lMonikerContainer[0], out lComObject); 

      // Check the object is an Excel workbook 
      if (lComObject is Microsoft.Office.Interop.Excel.Workbook) 
      { 
       Microsoft.Office.Interop.Excel.Workbook lExcelWorkbook = (Microsoft.Office.Interop.Excel.Workbook)lComObject; 
       // Show the Window Handle 
       MessageBox.Show("Found Excel Application with Window Handle " + lExcelWorkbook.Application.Hwnd); 
      } 
     } 
    } 
    finally 
    { 
     // Release ressources 
     if (lRunningObjectTable != null) Marshal.ReleaseComObject(lRunningObjectTable); 
     if (lMonikerList != null) Marshal.ReleaseComObject(lMonikerList); 
    } 
} 
0

Добавить ссылку на Microsoft.Office.Interop.Excel и использовать следующий код:

 Process xlP = Process.Start("excel.exe"); 
     int id = xlP.Id; 
     int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle; 

     Excel.Application oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

     if(xlP.MainWindowTitle.Contains(oExcelApp.ActiveWorkbook.Name) ) 
     { 
      //Proceed further 
     } 
Смежные вопросы