我们的 winforms 应用程序与 MS Word 交互,我们在生成文档时运行此代码,并且我们希望在我们的应用程序前面的 Word 中显示它:
[setup w as a Word interop object]
w.Visible = True
w.Activate()
当推广到运行 Office 2007 的 XP 机器时,这将按预期工作。
在运行 Office 2010的 Win7 机器上,文档在我们的应用程序后面加载并在任务栏上闪烁。
有任何想法吗?
我们的 winforms 应用程序与 MS Word 交互,我们在生成文档时运行此代码,并且我们希望在我们的应用程序前面的 Word 中显示它:
[setup w as a Word interop object]
w.Visible = True
w.Activate()
当推广到运行 Office 2007 的 XP 机器时,这将按预期工作。
在运行 Office 2010的 Win7 机器上,文档在我们的应用程序后面加载并在任务栏上闪烁。
有任何想法吗?
我最近偶然发现了一个类似的问题。我的 .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);
}
}
将应用程序从带有 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 中赢得了纸牌游戏......
我不是专家,但我遇到了同样的问题并在这里找到了方法。我无法获得任何其他解决方案,但我只是在这里找到了我的问题的答案......
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
在上面的链接中了解更多关于为什么这有效的信息。
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()
文档出现在前面。
我发现的最简单的方法是
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);