На основании ответа для 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 раньше имел режим просмотра одного документа, который может представить вам две версии иерархии окон в одном выпуске. Не делайте этого в коммерческих продуктах / продуктивных программах.