You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:42:37