【问题标题】:How to determine if the user has opened a new Microsoft Word Document?如何确定用户是否打开了新的 Microsoft Word 文档?
【发布时间】:2013-11-05 18:49:20
【问题描述】:

Visual C# 表单包含一个功能,可在按下特定按钮时创建一个空白的新 Microsoft 文档。一旦用户单击此按钮,我需要检查是否已经创建了一个新 Microsoft 文档,并且在创建之前仍然激活一个新的word文档,因此一次打开一个文档。

我正在尝试使用以下代码完成此操作:-

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool  IsWindow(IntPtr hWnd);

这将返回一个布尔值。我不知道如何检查输出?我将检查哪个参数以及相应的语法是什么?可能出现的问题是用户可以打开记事本,这将是激活窗口,因此我需要具体说明,因为它仅适用于 word 文档。通常,创建新文档时默认名称为 Document1,但用户可以选择保存和更改名称。

【问题讨论】:

  • 您是指新建 Word 文档还是 Word 窗口?
  • 当按钮被点击时,我激活了word并创建了一个空白文档。我们可以检查任何一个,我猜。
  • 但我更喜欢检查新的word文档。

标签: c# visual-studio-2010 msdn


【解决方案1】:

IsWindow 对你想要的东西不是很有用(你没有hWnd,窗口的句柄)。 FindWindow 会更有帮助;但问题是它(和其他等效的 WinAPI 调用)将给定窗口的名称作为参数,对于 MS Word,这是文档的名称(我猜你不知道)。

一种简单可靠的方法是查看正在运行的进程:

System.Diagnostics.Process[] Procs = System.Diagnostics.Process.GetProcessesByName("winword");
if (Procs.Length >= 1)
{
    //There is an opened Word document
} 

【讨论】:

  • 是否应该将“winword”替换为特定的字符串?
  • @Kribz "winword" 已经是特定的字符串。这是 Word 进程的名称:此代码(到达条件内部)可靠地预测是否存在正在运行的 Word 进程(= 打开的 Word 文档)。测试一下。
  • Procs.Lenght 值为 2,当我单步执行代码时。这是没有打开 word 文档或打开一个 word 文档时的情况。
  • @Kribz 肯定有 2 个正在运行的 Word 进程。也许其中一些没有关联的窗口(当您从应用程序打开 Word 文档并且未正确释放给定对象时,可能会发生这种情况)。通过查看窗口(例如通过 FindWindow),您可能会避免这种情况;但是,如前所述,这并非易事。在任何情况下,拥有这些正在运行的进程都表明您的应用程序没有正常运行,并且在打算打开新文档时无论如何都会出现问题(即使您没有看到窗口,给定的文件也已打开)。跨度>
  • @Kribz 做这个实验以确认一切正常:打开任务管理器 (CTRL+ALT+SUP),杀死所有正在运行的 Word 进程(在进程下,任何名称带有“winword”的) 并执行我的代码: Procs.Length 将为零。现在打开一个 Word 文档,你会看到 Procs.Length 是一。
【解决方案2】:

您可以检查进程检查运行进程并获取句柄ID。

System.Diagnostics.Process

Process[] allProcesses = Process.GetProcesses();
processName = <Todo: check process_name in the array for word document>
Regex r = WildcardToRegex(processName);

matching = allProcesses.Where((p) =>
            {
                try
                {
                    return r.IsMatch(p.MainModule.FileName);
                }
                catch
                {
                    return false;
                }
            }).Select((p) => p.Id);

找到 process_name 和 Process ID 后,您可以检查是否有新进程(在您的情况下为 WordDocument)正在运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多