【发布时间】:2018-10-31 11:47:05
【问题描述】:
我需要获取系统(Windows)中所有当前打开的 MSACCESS 实例的列表,以便能够从我的应用程序中关闭它们中的任何一个。我对 EXCEL 和 WINWORD 没有问题,但无法连接 Access。
我使用 Office 2016,我看到 MSACCESS 为每个打开的数据库文件创建单独的进程。所以我想我必须从窗口句柄中获取应用程序实例。我已尝试修改此代码:How to iterate through instance of Excel c#
我能够获取所有 MSACCESS 进程,但 Excel 或 Word 代码不适用于 MSACCESS。代码行:
if (buf.ToString() == "EXCEL7")
总是给我 MsoCommandBarDock 值。 关于如何实现这一目标的任何想法?
【问题讨论】:
-
MS Access 主窗口的类名恰好是
OMain(CS_OWNDC 风格)。为什么应该是EXCEL7?请注意,这在版本之间会有所不同,并且可能会在 MS 选择更新时随时更改。 MsoCommandBarDock 在窗口层次结构中太深了一两级。 -
在Access中,可以直接从顶层窗口的hWnd中获取应用对象。在 Excel 中,您需要获取特定的嵌套窗口,并且可以从它的 hWnd 中获取应用程序对象。这意味着您应该对 Access 使用更简单的方法。您可以使用从
(int)p.MainWindowHandle获取的 hWnd 直接调用AccessibleObjectFromWindow。您可以废弃所有枚举子窗口的代码。我会写一个简短的答案,但是我的 C# 充其量只是初学者级别,而且我没有手边的测试环境,这应该可以帮助您入门。 -
如果您只想关闭应用程序,为什么不直接按名称获取进程并终止它?
-
@krishKM 该应用程序应保存数据并正常关闭。简单的杀戮是不够的:(
-
@ErikvonAsmuth 就是这样!我必须省略子查找程序才能访问 MSAccess 应用程序类。请发布一个新答案,以便我接受。
标签: c# ms-access office-interop