7

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

[setup w as a Word interop object]

w.Visible = True
w.Activate()

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

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

有任何想法吗?

4

5 回答 5

7

我最近偶然发现了一个类似的问题。我的 .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);
    }
}
于 2011-02-10T10:13:21.173 回答
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 中赢得了纸牌游戏......

于 2013-03-08T23:15:36.797 回答
1

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

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

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

于 2014-01-27T13:21:49.360 回答
0

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()

文档出现在前面。

于 2015-04-30T09:00:18.143 回答
0

我发现的最简单的方法是

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);
于 2021-03-16T18:37:26.447 回答