2011-02-10 11 views
7

Nuestra aplicación winforms interactúa con MS Word y ejecutar este código cuando se genera un documento y quiere mostrarlo en Word delante de nuestra aplicación:¿Por qué Word no "llega al frente" cuando lo activamos?

[setup w as a Word interop object] 

w.Visible = True 
w.Activate() 

Cuando extenderá a máquinas de XP que ejecutan Office 2007 esto funciona según lo previsto.

En Win7 máquinas que ejecutan Office 2010 el documento se carga detrás de nuestra aplicación y parpadea en la barra de tareas.

¿Alguna idea?

+2

Tuve el mismo problema y después de investigar un poco en Google, se llegó al hecho de que este es un comportamiento indentado de Windows desde la versión 7. Este es un tipo de mecanismo de seguridad para evitar que otras aplicaciones perturben tu trabajo. Una aplicación (el programa que desea interoperar con la palabra) no puede cambiar el orden z de otras aplicaciones que no se ejecutan en el mismo proceso. No puedo pegar una url con información oficial sobre esto, solo recuerdo que encontré esto en la red un poco antes ... –

Respuesta

7

Me encontré con un problema similar recientemente. Mi programa .NET llamaba a una aplicación COM, pero en Win7 algunas veces ni aparecía en la barra de tareas ni en el escritorio. No estaba realmente capaz de localizar la causa de esto, pero escribí la siguiente función para evitar el problema:

[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); 
    } 
} 
+0

+1 buena solución! –

2

tenían el mismo problema al convertir una aplicación de XP con Word 2002 & 3 para Ganar 7 con Word 2010. Encontré los siguientes trabajos para el primer documento que abre, después de eso, todos los documentos nuevos aparecen en la barra de tareas parpadeando.

Después de abrir el documento de Word:

document.Activate(); 
mWordApplication.Activate(); 

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

La estrategia es ir tras la ventana en la que se muestra el documento. Minimizar y maximizar traerá la ventana del documento al frente.

Puede hacer lo mismo con el objeto de aplicación (como se sugiere aquí http://www.access-programmers.co.uk/forums/showthread.php?t=173871 nota: maximizar sin minimizar no ayuda si la ventana está maximizada para empezar), pero si tiene muchos documentos de Word abiertos, pensará que He ganado un juego de solitario en Windows ...

1

No soy un experto, pero me encontré con el mismo problema y encontré mi camino hasta aquí. No pude conseguir ninguna de las otras soluciones para trabajar, pero me acaba de encontrar una respuesta a mi problema aquí ...

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

simplemente he añadido una línea de la siguiente manera (la línea en negrita y cursiva ) a mi código y documentos de Word abierto en frente de Excel en Windows 7 máquinas que ejecutan Office 2010:

Dim wordApplication

Conjunto wordApplication = CreateObject ("Word.Application")

Application.ActivateMicrosoftApp xlMicrosoftWord

Más información sobre por qué esto funciona en el enlace anterior.

0

w.Visible = True w.Activate()

me funciona muy bien !!!

Ver los otros motivos.

por ejemplo

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

documento viene a frente.

Cuestiones relacionadas