【问题标题】:Why doesn't Word "come to front" when we activate it?为什么我们激活 Word 时它没有“出现”?
【发布时间】:2011-06-24 17:32:54
【问题描述】:

我们的 winforms 应用程序与 MS Word 交互,我们在生成文档并希望在应用程序前面的 Word 中显示它时运行此代码:

[setup w as a Word interop object]

w.Visible = True
w.Activate()

当推广到 运行 Office 2007 的 XP 计算机时,这将按预期工作。

在运行 Office 2010 的 Win7 计算机上,文档在我们的应用程序后面加载并在任务栏上闪烁。

有什么想法吗?

【问题讨论】:

  • 我遇到了同样的问题,在通过谷歌做了一些研究后发现这是 Windows 7 版以来的缩进行为。这是一种防止其他应用程序干扰的安全机制你的工作。一个应用程序(您想要与 word 互操作的程序)无法更改不在同一进程中运行的其他应用程序的 z 顺序。我无法粘贴带有官方信息的网址 - 我只记得我早些时候在网上找到了这个......

标签: .net ms-word office-interop z-order


【解决方案1】:

我最近偶然发现了一个类似的问题。我的 .NET 程序称为 COM 应用程序,但在 Win7 上,它有时既不会出现在任务栏中,也不会出现在桌面上。我无法真正找到造成这种情况的原因,但我编写了以下函数来解决此问题:

[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hwnd);

private static void BringAppToFront() {
    foreach (var p in System.Diagnostics.Process.GetProcesses().Where(p => p.ProcessName == "COMInstanceName")) {
        if (p.MainWindowHandle.ToInt32() != 0)
            SetForegroundWindow(p.MainWindowHandle);
    }
}

【讨论】:

    【解决方案2】:

    将应用程序从带有 Word 2002 和 3 的 XP 转换为带有 Word 2010 的 Win 7 时遇到同样的问题。发现您打开的第一个文档具有以下效果,之后任务栏中的任何新文档都会闪烁。

    打开Word文档后:

    document.Activate();
    mWordApplication.Activate();
    
    foreach (Word.Window window in document.Windows)
    {
        window.WindowState = Word.WdWindowState.wdWindowStateMinimize;
        window.WindowState = Word.WdWindowState.wdWindowStateMaximize;
    }
    

    策略是在显示文档的窗口之后。最小化和最大化会将文档的窗口放在前面。

    您可以对应用程序对象执行相同的操作(如此处所建议的 http://www.access-programmers.co.uk/forums/showthread.php?t=173871 注意:如果窗口从一开始就已最大化,则没有最小化的最大化将无济于事),但如果您打开了许多 Word 文档,您会认为你在 Windows 中赢得了一场纸牌游戏……

    【讨论】:

      【解决方案3】:

      我不是专家,但我遇到了同样的问题并在这里找到了方法。我无法获得任何其他解决方案,但我刚刚在这里找到了我的问题的答案......

      http://david.gardiner.net.au/2010/05/bad-old-days-of-vba-and-opening-word.html

      我刚刚在我的代码中添加了如下一行(粗斜体中的行),Word 文档在运行 Office 2010 的 Win 7 机器上的 Excel 前打开:

      暗字应用

      设置 wordApplication = CreateObject("Word.Application")

      Application.ActivateMicrosoftApp xlMicrosoftWord

      在上面的链接中了解更多关于为什么这样做的信息。

      【讨论】:

        【解决方案4】:

        w.Visible = True w.Activate()

        对我有用!!!

        查看其他原因。

        例如

         Dim oWord As Microsoft.Office.Interop.Word.Application = New      Microsoft.Office.Interop.Word.Application
         Dim oDoc As Microsoft.Office.Interop.Word.Document =    oWord.Documents.Open(Path)
         Dim range As Microsoft.Office.Interop.Word.Range = oDoc.Range
         range.Find.Execute("[NUM]", False, False, , , , , , , _NUM_, 2, False, )  
         oWord.Visible = True
         oWord.Activate()
        

        文档出现在前面。

        【讨论】:

          【解决方案5】:

          我发现的最简单的方法是

          Word.Application wordInstance = new Word.Application();
          ...
          wordInstance.Visible = true;
          SetForegroundWindow(wordInstance.Application.ActiveWindow.Hwnd);
          
          ...
          [DlImport("User32.dll")]
          [return: MarshalAs(UnmanagedType.U4)]
          static extern int SetForegroundWindow(int hwnd);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-27
            • 2020-03-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-17
            • 1970-01-01
            相关资源
            最近更新 更多