当前位置: 首页 > news >正文

获取第一个运行的Word应用程序实例

获取第一个运行的COM应用程序实例

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Runtime.InteropServices;
 4 using System.Runtime.InteropServices.ComTypes;
 5 
 6 /// <summary>
 7 /// 提供查询运行中COM对象的改进方案
 8 /// </summary>
 9 public static class ComObjectQuery
10 {
11     [DllImport("ole32.dll")]
12     private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);
13 
14     /// <summary>
15     /// 获取当前运行中指定类型的COM对象实例
16     /// </summary>
17     /// <typeparam name="T">要查询的COM接口类型</typeparam>
18     /// <returns>找到的COM对象列表,如果没有找到则返回空列表</returns>
19     public static IReadOnlyList<T> GetRunningObjects<T>()
20     {
21         var instances = new List<T>();
22         
23         try
24         {
25             // 获取运行对象表
26             if (GetRunningObjectTable(0, out var rot) != 0 || rot == null)
27             {
28                 return instances;
29             }
30 
31             try
32             {
33                 // 枚举运行中的对象
34                 rot.EnumRunning(out var monikerEnum);
35                 if (monikerEnum == null)
36                 {
37                     return instances;
38                 }
39 
40                 try
41                 {
42                     monikerEnum.Reset();
43                     var moniker = new IMoniker[1];
44                     var fetched = IntPtr.Zero;
45 
46                     // 遍历所有运行中的对象
47                     while (monikerEnum.Next(1, moniker, fetched) == 0)
48                     {
49                         try
50                         {
51                             // 获取对象实例
52                             rot.GetObject(moniker[0], out var comObject);
53                             if (comObject is T typedObject)
54                             {
55                                 instances.Add(typedObject);
56                             }
57                             else if (comObject != null)
58                             {
59                                 Marshal.ReleaseComObject(comObject);
60                             }
61                         }
62                         catch (Exception ex)
63                         {
64                             // 记录错误但继续处理其他对象
65                             System.Diagnostics.Trace.WriteLine($"获取COM对象时出错: {ex.Message}");
66                         }
67                     }
68                 }
69                 finally
70                 {
71                     Marshal.ReleaseComObject(monikerEnum);
72                 }
73             }
74             finally
75             {
76                 Marshal.ReleaseComObject(rot);
77             }
78         }
79         catch (Exception ex)
80         {
81             System.Diagnostics.Trace.WriteLine($"查询运行COM对象时发生错误: {ex.Message}");
82         }
83 
84         return instances;
85     }
86 
87     /// <summary>
88     /// 获取第一个匹配的COM对象实例
89     /// </summary>
90     /// <typeparam name="T">要查询的COM接口类型</typeparam>
91     /// <returns>找到的第一个COM对象,如果没有找到则返回null</returns>
92     public static T GetFirstRunningObject<T>()
93     {
94         var objects = GetRunningObjects<T>();
95         return objects.Count > 0 ? objects[0] : default;
96     }
97 }
View Code

 

调用方法:

// 获取所有运行的Excel应用程序实例
var excelApps = ComObjectQuery.GetRunningObjects<Microsoft.Office.Interop.Excel.Application>();// 获取第一个运行的Word应用程序实例
var wordApp = ComObjectQuery.GetFirstRunningObject<Microsoft.Office.Interop.Word.Application>();

  

http://www.wxhsa.cn/company.asp?id=1866

相关文章:

  • S7-1500 TRACE功能组态 (转载)
  • 如何在Proxmox VE中使用fdisk命令行扩展LVM存储池 - 若
  • 垃圾AV覆盖defender
  • SAP-PO:怎么控制传输的内容在单数据情况下是数组格式还是单对象格式
  • 开源新基建:数字中国创新发展的底层密码与生态实践
  • 员工离职停用Salesforce帐号?这11个“坑”千万别踩!
  • Linux的运行模式
  • Spring Boot + MybatisX,效率翻倍!
  • 条码控件Aspose.BarCode教程:使用 Java 自动生成 DotCode 条形码
  • AI 玩转网页自动化无压力:基于函数计算 FC 构建 Browser Tool Sandbox
  • AI时代的全栈框架:独立开发者的机会与挑战
  • 创建逻辑卷
  • Server 13 ,CentOS 上使用 Nginx 部署多个前端项目完整指南( 协助多端口与脚本自动化 )
  • 洛谷P2490 [SDOI2011] 黑白棋
  • WGCLOUD的告警日志在哪儿存贮的?
  • 传统软件部署的痛点
  • HarmonyOS 5分布式数据管理初探:实现跨设备数据同步
  • qoj965 Trade
  • 复盘我的第一个 大模型Agent:从核心循环到模块化架构的演进之路
  • Linux内核不使用bear如何快速生成compile_commands.json使用vscode阅读源码
  • Docker 容器化
  • phpmyadmin漏洞利用
  • CF19E Fairy
  • Wireshark 学习笔记(二)
  • 鸿蒙应用开发从入门到实战(三):第一个鸿蒙应用
  • Litctf2025 Write-up
  • DFS算法(递归)
  • 博客园出海记
  • vue3 - pinia状态管理库
  • 做会议海报就是在淘汰老实人