如何在运行system.__comobject前判断对应Access窗体是否已打开
Access已打开窗体检测问题
我通过以下代码获取Access的COM对象:
dynamic app = Marshal.GetActiveObject("Access.Application");
并通过下面的方法成功打开目标窗体:
app.Run("gbOpenDataEditPart", "ediQuali.170013662.Wawi");
现在需要判断这个特定窗体是否已经打开,但没找到类似IsOpen的可行方法。
我也尝试过用PowerShell脚本检测:
$accessApp = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Access.Application") $forms = $accessApp.CurrentProject.AllForms foreach ($form in $forms) { Write-Host "Form name: $($form.Name)" }
但遍历AllForms时,无论Access中打开多少窗体,始终只检测到frmSysAuskunft这一个,用以下语句也找不到目标窗体:
CurrentProject.AllForms("HPGebote").IsLoaded
或
CurrentProject.AllForms("ediQuali.170013662.Wawi").IsLoaded
可行的检测方法
方法1:遍历Application.Forms集合
CurrentProject.AllForms是数据库中所有已存在的窗体对象(包括未打开的),而Application.Forms才是当前已加载(打开)的窗体集合。可以通过遍历这个集合来判断目标窗体是否打开:
C#代码示例:
dynamic app = Marshal.GetActiveObject("Access.Application"); bool isFormOpen = false; string targetFormName = "ediQuali.170013662.Wawi"; foreach (dynamic form in app.Forms) { if (form.Name.Equals(targetFormName, StringComparison.OrdinalIgnoreCase)) { isFormOpen = true; break; } } // 输出结果 Console.WriteLine($"窗体 {targetFormName} 是否打开:{isFormOpen}");
PowerShell代码示例:
$accessApp = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Access.Application") $targetFormName = "ediQuali.170013662.Wawi" $isFormOpen = $false foreach ($form in $accessApp.Forms) { if ($form.Name -eq $targetFormName) { $isFormOpen = $true break } } Write-Host "窗体 $targetFormName 是否打开:$isFormOpen"
方法2:直接访问Application.Forms中的窗体
如果确定窗体名称准确,可以直接尝试访问,捕获异常来判断:
C#代码示例:
dynamic app = Marshal.GetActiveObject("Access.Application"); bool isFormOpen = false; string targetFormName = "ediQuali.170013662.Wawi"; try { // 尝试访问窗体,如果不存在会抛出异常 dynamic form = app.Forms[targetFormName]; isFormOpen = true; } catch (Exception) { isFormOpen = false; } Console.WriteLine($"窗体 {targetFormName} 是否打开:{isFormOpen}");
注意事项
- 你通过
gbOpenDataEditPart打开的窗体,可能是动态命名的,需要先遍历Application.Forms输出所有已打开窗体的名称,确认目标窗体的真实名称。 Application.Forms只包含当前处于打开状态的窗体,未打开的不会出现在这个集合中。
内容的提问来源于stack exchange,提问作者BeginnerWPF
相关产品推荐
相关产品推荐

