获取上次打开的 MS Word 文档对象

2023-12-02

我有一个从 MS Word 2003 模板 (.dot) 中的 VBA AutoNew() 子函数调用的 python 脚本 - 因此每次从此 Word 模板创建文档时它都会运行。

第三方应用程序从此模板创建文档。第三方应用程序如何设置文档存在许多格式问题,因此我的脚本会在第三方脚本完成运行后对其进行调整。 (我最初是用 VBA 编写脚本的,但是 VBA 计时器的问题导致它在很大一部分时间里崩溃。Python 版本工作得完美无缺。)

我希望脚本只处理调用它的文档,该文档始终是最近打开的 Word 文件。 (该文件是 .doc 而不是 .docx,如果这有什么区别的话。)我找到了三种获取打开的 Word 实例的方法(因为该脚本是由 AutoNew 调用的,所以将始终有一个可用的打开实例):

win32com.client.GetActiveObject (Class = 'Word.Application')
win32com.client.gencache.EnsureDispatch('Word.Application')
win32com.client.Dispatch('Word.Application')

如果新创建的文档是唯一打开的 Word 文件,那么这三个文件中的任何一个都可以很好地工作。但是,如果 Word 文档已打开,并且我运行第三方软件从该模板创建新文档,则 python 脚本每次都会使用所有三种方法获取旧实例。

我尝试寻找循环遍历Word文档的方法,想法是我可以检查所有名称并选择最后数字最大的那个(在脚本运行时,文档不会被保存,所以它的名称将是 Document1、Document2 等)不幸的是,我只找到了循环关闭文档的方法(打开一个、做某事、关闭它、继续下一个),而不是(如我的情况)已经打开的文档。

有没有办法将 python 定向到最近打开的 Word 文档?

EDIT相关问题:Word VBA 和多个 Word 实例

我找到了如何获取我想要控制的文档的 Windows 句柄整数:

import win32gui
import re

#Create a list of all open Microsoft Word document titles and their
#handle integers
titles = []
def foreach_window(hwnd, lParam):
    if win32gui.IsWindowVisible(hwnd):
        title = win32gui.GetWindowText(hwnd)
        if 'Microsoft Word' in title:
            titles.append([title, hwnd])
    return True
win32gui.EnumWindows(foreach_window, None)

#Find the handle of the newest open, unsaved Word document
winOrder = []
for s in titles:
    item = re.search(r'Document\d', s[0])
    if item:
        winOrder.append(int(re.search(r'\d+', s[0]).group()))
    else:
        winOrder.append(0)
hwnd = titles[winOrder.index(max(winOrder))][1]

#Get the edit window from inside the Word instance
def callback(hwnd, hwnds):
    if win32gui.GetClassName(hwnd) == '_WwG':
        hwnds.append(hwnd)
        #I think there should be a 'return False' here to let EnumChildWindows
        #know it doesn't have to keep looping once it finds the edit window,
        #but it crashes with 'pywintypes.error: (0, 'EnumChildWindows', 
        #'No error message is available') if I try that
    return True
hwnds = []
win32gui.EnumChildWindows(whndl, callback, hwnds)

#Something like this...
#window = win32gui.AccessibleObjectFromWindow(hwnds[0])

那么现在 - 如何从 Windows 句柄创建 COM 对象?


通过搜索 NVDA(非可视化桌面访问)的 GitHub 代码,我终于找到了我正在寻找的对象:

#Part of the pywin32 package that must be installed with the pywin32
#installer:
import win32com.client as win32
import win32gui

from ctypes import oledll
from ctypes import byref

#installed by easy_install comtypes
from comtypes import POINTER
from comtypes.automation import IDispatch
import comtypes.client.dynamic as comDy

#Handle integer hwnds[0] per my edit in the question

OBJID_NATIVEOM = -16
p = POINTER(IDispatch)()
oledll.oleacc.AccessibleObjectFromWindow(hwnds[0], OBJID_NATIVEOM,
    byref(IDispatch._iid_), byref(p))

window = comDy.Dispatch(p)
word = window.application
cert = word.Documents(1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取上次打开的 MS Word 文档对象 的相关文章

  • 是否可以从C语言函数写入word文件?

    我有一个用 C 语言编写的图书馆管理系统 其中有 I O 文件 dat 如何从该函数中获取word文件的输出 void viewbooks void show the list of book persists in library int
  • 通过 Office API 将多个 Word 文档保存为 HTML

    我有大量的Word文档需要解析 由于它们都是从同一个模板创建的 我认为最好的方法是将它们保存为 HTML 文件并解析 HTML 本身 虽然将单个 Word 文档保存为 HTML 相当容易 但我还没有找到从 Word 内部执行批量过程的方法
  • 在网页中编辑Word文档

    我意识到这个问题以前已经被问过很多次了 但现在很多都已经老了 没有答案 我需要用户能够从我的网页编辑Word文档 是否有任何编辑器或组件可以让我执行此操作 一些背景知识 用户将能够将 Word 文档上传到我的网站 然后从那里查看 编辑它 用
  • 在 MS Word 中运行外部 vba 代码

    我可以将外部代码链接到 Word 文档吗 我有很多带有宏的 Word 文档 VBA 代码 全部使用相同的代码 我希望代码从外部源运行 而不是从所有这些文档中运行 这样 如果我必须更新代码 我只有一个地方需要更新 您可以创建一个模板并将其放入
  • Word通配符搜索的正则表达式查找包含至少3个连续数字的括号

    在以下示例中 airspeed AS user 104A 104B device 101 vehicles 105A C 搜索应该找到 104A 104B 101 and 105A C 但不是 AS 我尝试使用 0 9 0 9 0 9 但这
  • 如何使用 Microsoft.Office.Interop.Word 将光标移动到特定段落?

    我们正在开发C Net 4 0基于 Windows 窗体的应用程序使用Microsoft Office Interop Word参考 现在我想将光标的位置移动到特定段落 我怎么做呢 void MoveToParagraph Microsof
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何在Python中捕获打印机事件

    我想在打印机开始打印时捕获信号 如果你告诉我如何获取将要打印的文档的路径 那就太好了 pywin32print看起来很有用 但不知道怎么用 要获得新打印作业的通知 您可以使用FindFirstPrinterChangeNotificatio
  • 如何获取 Word 应用程序的 Hwnd/进程 ID,并将其设置为前台窗口

    我希望我的 Word 应用程序在自动化完成后进入前台 Excel 中的等效项很简单 Excel Application 对象有一个 Hwnd 属性 您可以将其与 Windows API 结合使用 SetForegroundWindow In
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 在 Java 中使用 Apache POI XWPF 在同一个 Word 文档中横向和纵向页面

    我正在尝试使用 Java 和 Apache POI 库创建一个包含一些横向页面和一些纵向页面的 Word 文档 我可以更改所有页面的方向 但有没有办法只更改其中某些页面的方向 我尝试过使用不同的部分和主体 但无济于事 目前我已经编写了一个函
  • 将文档属性字段添加到页脚会删除现有的页码

    我想在文档中每个页面的页脚中标记一个文档变量字段 我已经弄清楚如何添加该字段 但是 这样做时 页脚中已存在的页码字段将被禁用 仅保留文本并且不再充当动态页码 这是我的代码 它添加了该字段 但以某种方式禁用了页码 sectionFooter
  • OpenXML:添加新段落时插入了lastRenderedPageBreak

    我使用 OpenXML 添加一个新段落 如下所示 var pSpacerAfterSectorTitle insertNodeSectorsArea AppendChild GetNewParagraph Arial 12 true fal
  • python - 使用 win32file.ReadFile 读取文件

    类似问题 使用 win32file ReadFile 从管道获取输出的正确方法是什么 https stackoverflow com questions 2069344 whats the correct way to use win32f
  • Pythoncom - 将相同的 COM 对象传递给多个线程

    你好 对于 COM 对象 我是一个完全的初学者 非常感谢任何帮助 我正在开发一个Python程序 该程序应该以客户端 服务器的方式读取传入的MS Word文档 即客户端发送一个请求 一个或多个MS Word文档 服务器使用pythoncom
  • 在 C# WinForms 中预览文档(Word、Excel、PDF、文本文件等)?

    我正在开发一个 C WinForms 应用程序 我希望能够 预览 其中的各种文档类型 也就是说 当用户从列表中选择文件名时 它会在下面以相同的形式显示所选文件的预览 这很像 Outlook 允许您无需双击即可预览选定邮件的方式 有没有什么方
  • 在 pywin32 中创建一个新的 Excel 文件

    我正在编写一个程序 概括来说 采用记事本文件并将其另存为 Excel 文件 现在我的程序打开一个我创建的空白 Excel 文件 只是 Book1 xls xlApp Dispatch Excel Application xlApp Visi
  • 邮件合并到word中

    创建标签的最佳方法是使用现有的行业标准工具 例如 Microsoft Word 您如何执行此操作并设置运输标签 我不确定如何将合并字段映射到数据网格视图列 这是我到目前为止的代码 Create a new empty document Do
  • 如何使用后期绑定访问 Microsoft Word 现有实例

    我正在用 C 开发一些代码 我将在其中与 Microsoft Word 进行交互 我希望能够选择重新使用现有实例或作为创建新实例的替代方案 请记住 我想使用 LATE BINDING 来完成所有这些 可以肯定地说 我已经弄清楚如何在创建新实

随机推荐

  • QMdiSubWindow 中的 qt 定位控件

    I have problem with positioning controls in QMdiSubWindow derivate I designed my window using QtDesigner and it looks li
  • 将带有数字键的数组转换为对象

    我正在研究 PHP 的转换机制 在将数组转换为对象时遇到了一个奇怪的情况 o object array 1 gt foo bar o new stdClass var dump o 据我了解 PHP 属性需要使用与 PHP 变量相同的规则来
  • 使用Numpy的loadtxt读取十六进制数字

    我只能从文本文件中读取整数值 但是当我尝试读取十六进制格式的整数时 会发生错误 我正在使用的代码行是 output np loadtxt fidOut dtype int32 delimiter n 你能帮助我吗 您需要添加一个转换器 以便
  • .bat 脚本来比较两个 Windows 文件夹的内容

    我想编写一个简短的 bat 脚本来比较两个文件夹的内容 文件夹 1 包含约 1300 个文件 文件夹 2 包含约 400 个文件 我想要一个可以通过 Windows 命令行运行的脚本 该脚本将文件夹 2 中的每个文件检查以查看文件夹 1 中
  • ShoppingCart 类型的clear() 方法未定义

    我正在通过JSP实现一个购物网站 我有一个名为的 Java 对象ShoppingCart还有一个叫做 Item 在ShoppingCart有一个包含 Item 对象的向量 这个想法是当我打电话给addItem 方法 我使用 cart add
  • 如何在 Python 中将文件读入列表? [复制]

    这个问题在这里已经有答案了 我想提示用户生成一些随机数并将其保存到文件中 他给了我们那部分 我们要做的部分是打开该文件 将数字转换为列表 然后查找平均值 标准差等 而无需使用简单的内置 Python 工具 我尝试过使用open但它给了我无效
  • 更改 Rectangle.Fill 或 Grid.Background 的自定义颜色

    我可以在 xaml 中使用以下内容更改自定义颜色矩形 A125AA 但我不知道在哪里可以找到更改自定义颜色的代码 我只知道颜色代码有 this gridgcolor Background new SolidColorBrush Colors
  • 有反向代理能力的纯Python网络服务器?

    我正在寻找一个基于纯Python的Web服务器也具有反向代理的能力 看一下Twisted 特别是其反向代理资源 Twisted Web 还提供了在反向代理后面设置的各种工具 这是将 Twisted 应用程序与现有站点集成的建议机制
  • mvc3,编辑器模板,css 类,最大长度和大小

    我有一个编辑器模板如下 但 class maxlength 和 size 属性未获取源代码 using System Globalization model DateTime Html TextBox Model null Model Ha
  • GCC 常量变量的弱属性

    我有一个关于 const 变量的弱属性的问题 我用 gcc 编译了以下几个文件 main c include
  • Powershell - 每月计划任务触发器

    我目前正在通过 Powershell 自动创建计划任务 并且我正在使用New ScheduledTaskAction New ScheduledTaskTrigger and Register ScheduledTask命令 现在 我有一些
  • 删除所有已安装的 OpenCV 库

    我正在运行 Kubuntu 11 10 带有 KDE 4 8 在阅读这一切之前 我只想从我的系统中删除 OpenCV 的所有痕迹 这样我就可以重新开始 整个故事 我首先安装了 python opencv 和 libopencv 我认为是 2
  • Javascript 中函数声明中的双冒号?

    今天我发现了这段代码片段 我找不到anything相关解释此语法 真的是JavaScript吗 这是对的吗 如果不是 代码应该是什么样子 这是一个没
  • 更新到 laravel 5.4 后出现会话错误

    从laravel 5 3更新到5 4后 我在vendor中遇到了错误 错误是 Symfony Component Debug Exception FatalThrowableError 调用 var www ostadbank com ve
  • Android BLE扫描模式设置间隔

    我正在编写一个小型测试应用程序来评估蓝牙模块 该应用程序当前正在使用积极的匹配模式和低延迟扫描模式进行扫描 我们控制了蓝牙模块的广告间隔 并正在尝试评估需要多少广告才能触发android中的回调 有谁知道与低延迟 平衡和低功耗扫描模式设置相
  • 使用 Java 在 GUI 编程中混合 awt 和 swing

    我在 SO 上读到混合 awt 和 swing 对于 Java 中的 GUI 编程来说并不是一个好的方法 但我无法找到任何在使用 swing 时不使用某些 awt 组件的示例 例如 即使使用 swing 我遇到的大多数示例也会使用 awt
  • MySQL:如何查询父子关系?

    假设有如下表记录 TABLE foo foo id foo parent id 1 NULL 2 NULL 3 1 4 2 5 1 6 1 7 2 8 1 9 NULL
  • Log4J 2 查找值在加载/呈现之前在配置中使用

    我正在使用 SystemPropertiesLookup 查找来配置我的 Log4J2 配置 系统属性被设置为我的主要方法中的第一行 问题是 当 Log4J 加载配置时 尚未调用 main 方法 因此系统属性尚未填充 这是我的 log4j2
  • 模板类 - 无法解析的外部符号[重复]

    这个问题在这里已经有答案了 我经常收到这个错误 但我不知道为什么 有人可以帮我找到原因吗 编辑 删除代码 将实现 您的方法定义 与类声明一起放入标头中 请参阅这在 C 常见问题解答中 一些编译器支持 export 关键字来按照您的方式执行此
  • 获取上次打开的 MS Word 文档对象

    我有一个从 MS Word 2003 模板 dot 中的 VBA AutoNew 子函数调用的 python 脚本 因此每次从此 Word 模板创建文档时它都会运行 第三方应用程序从此模板创建文档 第三方应用程序如何设置文档存在许多格式问题