VSTO获取公共对象:Word篇

  • 发布时间:2016年11月18日 16:40
  • 作者:杨仕航
  • 分类标签: VSTO
  • 阅读(6853)
  • 评论(0)

上一篇博文写的是获取Excel的一些公共对象和方法。这次再补充获取Word的公共对象和方法等。

同样,为了方便迁移,需要将Word的Application当作参数传递进去:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using Word = Microsoft.Office.Interop.Word;

namespace DTPT.Base //命名空间自己改成自己的
{
    /// <summary>
    /// 获取Office对象
    /// </summary>
    public class ClsWordObject
    {
        //构造函数
        public ClsWordObject(Word.Application app)
        {
            this.App = app;
        }
        
        /// <summary>
        /// 获取或设置Word的Application
        /// </summary>
        public Word.Application App { get; set; }
        
        public Word.Application Application 
        {
            get { return Globals.ThisAddIn.Application; }
        }

        /// <summary>
        /// 获取全部文档
        /// </summary>
        public Word.Documents Documents
        {
            get { return this.App.Documents; }
        }

        /// <summary>
        /// 获取当前活动的文档
        /// </summary>
        public Word.Document ActiveDocument
        {
            get
            {
                if (this.Documents.Count > 0)
                    return this.App.ActiveDocument;
                else
                    return null;
            }
        }

        /// <summary>
        /// 获取选择的对象
        /// </summary>
        public Word.Selection Selection
        {
            get { return this.App.Selection; }
        }
    }
}

目前,我用得比较多的是这几个对象。

另外,我还添加了一个获取Word的hwnd句柄方法。在Excel中的Application有hwnd属性,而Word没有。

这个需要通过API去获取。使用Spy++查得如下图:

我打开了两个Word文档,得到两个同样的类名。既然有类名,那么可以使用FindWindow的API函数去获取句柄:

[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);

/// <summary>
/// 获取当前Word的句柄
/// </summary>
public static int Hwnd
{
    get { return FindWindow("OpusApp", null); }
}

全部代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using Word = Microsoft.Office.Interop.Word;

namespace DTPT.Base //命名空间自己改成自己的
{
    /// <summary>
    /// 获取Office对象
    /// </summary>
    public class ClsWordObject
    {
        //构造函数
        public ClsWordObject(Word.Application app)
        {
            this.App = app;
        }
        
        /// <summary>
        /// 获取或设置Word的Application
        /// </summary>
        public Word.Application App { get; set; }
        
        public Word.Application Application 
        {
            get { return Globals.ThisAddIn.Application; }
        }

        /// <summary>
        /// 获取全部文档
        /// </summary>
        public Word.Documents Documents
        {
            get { return this.App.Documents; }
        }

        /// <summary>
        /// 获取当前活动的文档
        /// </summary>
        public Word.Document ActiveDocument
        {
            get
            {
                if (this.Documents.Count > 0)
                    return this.App.ActiveDocument;
                else
                    return null;
            }
        }

        /// <summary>
        /// 获取选择的对象
        /// </summary>
        public Word.Selection Selection
        {
            get { return this.App.Selection; }
        }
        
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private static extern int FindWindow(string lpClassName, string lpWindowName);
        
        /// <summary>
        /// 获取当前Word的句柄
        /// </summary>
        public static int Hwnd
        {
            get { return FindWindow("OpusApp", null); }
        }
    }
}


上一篇:VSTO用正则表达式解决Excel数值问题

下一篇:VSTO获取公共对象:Excel篇

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空