Получить все экземпляры приложений MSACCESS с помощью C # Interop - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно получить список всех открытых в данный момент экземпляров MSACCESS в системе (окна), чтобы иметь возможность закрыть любой из них из моего приложения. У меня нет проблем с EXCEL и WINWORD, но я не могу подключиться к Access.

Я использую Office 2016 и вижу, что MSACCESS создает отдельный процесс для каждого открытого файла базы данных. Поэтому я думаю, что я должен получить экземпляры приложения из дескрипторов окна. Я пытался адаптировать этот код: Как перебрать экземпляр Excel c #

Я могу получить все процессы MSACCESS, но код Excel или Word не работает для MSACCESS. Строка кода:

if (buf.ToString() == "EXCEL7")

Всегда дает мне значение MsoCommandBarDock . Есть мысли о том, как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Есть много способов сделать это, включая извлечение COM-объектов из ROT (таблица запущенных объектов) . Поскольку для закрытия приложений вам нужно « just », следующий код должен работать нормально.

using System.Diagnostics;
using System.Linq;

Process.GetProcessesByName("MSACCESS").All(x => x.CloseMainWindow());

Отправляет сообщение о закрытии на все Доступ к основным окнам, что аналогично закрытию приложения пользователем.

0 голосов
/ 01 ноября 2018

На основании ответа для Excel версия Access похожа:

const uint OBJID_NATIVEOM = 0xFFFFFFF0;

var procs = new List<Process>(Process.GetProcessesByName("MSACCESS.EXE"));

foreach (var p in procs)
{
    var mainHandle = (int)p.MainWindowHandle;
    if (mainHandle > 0)
    {
        var IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
        Microsoft.Office.Interop.Access.Application app = null;
        int res = AccessibleObjectFromWindow(mainHandle, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), ref app);
        if (res >= 0)
        {
            Debug.Assert(app.hWndAccessApp == mainHandle);
            Console.WriteLine(app.Name);
        }
    }
}

Я протестировал его с помощью Access 2016 на Windows 10, локаль en-us. Основное отличие состоит в том, что иерархия доступа к окнам не такая сложная, как в Excel, поэтому вы можете пропустить итерацию дочерних окон.

Отказ от ответственности: это зависит от внутренней структуры Windows-приложения с закрытым исходным кодом. Корпорация Майкрософт как ее поставщик не одобряет подобные хитрости по очевидным причинам: они могут отправлять и обновлять или выпускать новую версию в любое время, когда изменилась внутренняя структура (иерархия окон), нарушая код, который зависит от этого. Кроме того, MS Access раньше имел режим просмотра одного документа, который может представить вам две версии иерархии окон в одном выпуске. Не делайте этого в коммерческих продуктах / продуктивных программах.

...