** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Visual Basic Clásico (VB3...VB6)
  Mensajes nuevos Mensajes nuevos RSS - Traer ventana de Word al frente
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Traer ventana de Word al frente

 Responder Responder
Autor
Mensaje
Medardo Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 03/Marzo/2005
Localización: Cuba
Estado: Sin conexión
Puntos: 1987
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Medardo Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Traer ventana de Word al frente
    Enviado: 04/Agosto/2015 a las 18:44

Hola

 

Desde VB creo un objeto de Word:

    Set AppInfWord = CreateObject("Word.Application")

  

Lo hago invisible para que el proceso sea transparente al usuario, mientras muestro una barra de progreso:

    AppInfWord.Application.Visible = False

 

Una vez colocado en Word toda la información necesaria, hago visible el Word:

    AppInfWord.Application.Visible = True

 

Hasta ahí todo bien. El problema está en que Word queda detrás de la aplicación de VB, y lo que necesito es lo contrario. Es decir, una vez que se muestre el Word, queda delante de la aplicación de VB.

He hecho algunos intentos con API, pero no me han resultado.

 

¡Ah! Cuando trabajo con XP, Word queda delante (como necesito), pero si corro la aplicación en Windows7, me ocurre lo contrario.

 

¿Alguna idea?

Saludos
Desde La Habana, Cuba
Medardo
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 4761
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Agosto/2015 a las 22:16
Hola!

Mira a ver si con la Funcion Shell lo puedes solucionar.

Un Saludo.
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Prisión Brieva
Estado: Sin conexión
Puntos: 3174
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Agosto/2015 a las 23:03
Buenas tardes Medardo.

Esto lo tengo de hace años y no se quién es el autor (probablemente el mismo Microsoft, pero no lo se seguro)
 
Se debe arrancar desde la subfunción Medardo.
 
Un saludo.
 
Luis
 
EDITO: Está en VBA no en VB, pero supongo que te será igualmente útil.

Option Explicit
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Public Declare Function GetForegroundWindow Lib "user32" () As Long
Public Const GW_HWNDFIRST = 0&
Public Const GW_HWNDNEXT = 2&
Private Function GetWindowsToFront(ByVal windowName As String) As Long
    Dim hwnd As Long
    Dim lLenT As Long
    Dim lRet As Long
    Dim strTitle As String
   
    On Error GoTo Error
   
    hwnd = GetForegroundWindow
    hwnd = GetWindow(hwnd, GW_HWNDFIRST)
   
    Do While (hwnd <> 0)
        lLenT = GetWindowTextLength(hwnd)
        If (lLenT <> 0) Then
            strTitle = String$(lLenT, 0)
            lRet = GetWindowText(hwnd, strTitle, lLenT + 1)
           
            If strTitle = windowName Then
                GetWindowsToFront = hwnd
                Exit Function
            End If
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop
    Exit Function
Error:
    MsgBox "ERROR"
End Function
 
Sub Medardo()
Dim AppInfWord As Object
Set AppInfWord = CreateObject("Word.Application")
AppInfWord.Application.Visible = False
AppInfWord.Application.Visible = True
GetWindowsToFront ("Microsoft Word")
End Sub


Editado por lbauluz - 04/Agosto/2015 a las 23:07
Those are my principles, and if you don't like them... well, I have others. Groucho Marx
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Prisión Brieva
Estado: Sin conexión
Puntos: 3174
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Agosto/2015 a las 23:05
Por cierto, no es lo más optimizado del mundo, ya que no solo toma los títulos de las ventanas sino de cualquier objeto, por lo que dependiendo de lo que tengas abierto en el PC, puede tardar un poco más de la cuenta .
 
Luis
Those are my principles, and if you don't like them... well, I have others. Groucho Marx
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 4761
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Agosto/2015 a las 23:28
Una pregunta?

Has probado mandar el foco al documento Word tras: AppInfWord.Application.Visible = True
Un Saludo.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10346
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Agosto/2015 a las 09:55
Como bien apunta Medardo, este comportamiento depende de los equipos y su configuración (sobre todo la versión de windows).

La primera vez que me lo encontré intenté pasarle el foco (Mounir), traer la ventana al primer plano (LBauluz), pero lo que realmente me vino bien fué lo que propone Mounir en su primer post, cerrarlo y volver a abrirlo, solo que yo utilizo el ShellExecute (está ampliamente documentada en este foro).

Por cierto, cuando llegué con la aplicación al cliente, no le dieron la más mínima importancia al asunto, estaban acostumbrados a que la información se quedara en segundo plano y buscarla ellos.

Otra cosa, a mi me pasó con Excel.

Saludos.




Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Medardo Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 03/Marzo/2005
Localización: Cuba
Estado: Sin conexión
Puntos: 1987
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Medardo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Agosto/2015 a las 19:52
Ante todo, un saludo y muchas gracias a todos por sus respuestas.

Bueno, pues creo que Mihura ha colocado el resumen.

LBauluz, el código que me envías no realiza el efecto que necesito.

He hecho infinidades de ejemplos (por eso no he contestado antes), incluso con API’s y lo único que resultó fue la función Shell, de la siguiente manera:

'primero salvo el documento
AppInfWord.ActiveDocument.SaveAs (App.Path & "\MiDocWord.doc")

'cierro el documento
AppInfWord.Quit

'Creo la siguiente función en un módulo, aunque no es necesario, pero así me sirve para cualquier otro fichero:
Public Function ExecuteFile(FilePath As String)
    Dim EjecShell As Variant
    On Error GoTo error
    EjecShell = Shell("rundll32.exe url.dll,FileProtocolHandler " & (FilePath), vbMaximizedFocus)
    Exit Function
error:     MsgBox Err.Description, vbExclamation, "Error"
End Function

'llamo a la función de la siguiente manera:
ExecuteFile App.Path & "\MiDocWord.doc"

Todo parece perfecto, pero aun encontrando una solución, no he resuelto el problema. Resulta que con Shell, estoy obligado a salvar primero el documento y nunca me ha gustado obligar al usuario para nada. La salva que la hagan ellos, con el nombre que deseen y en el lugar que quieran. Incluso, desde hace mucho tiempo, no realizo programas con reportes prediseñados, sino, un formulario donde el usuario selecciona los datos (campos) que les interesa, más una serie de opciones para los campos que lo requieran que, en su conjunto, conforman el reporte final a interés del usuario.

De modo que, sigo en las mismas: ¿Cómo darle el foco a un documento de Word recién creado, pero aún no salvado?

Si alguien aún tiene alguna idea, bienvenido, sino, voy a pensar como le pasó a Mihura (que lo busquen en segundo plano), y en ese caso, podrían cerrar el hilo.

Gracias a todos.
Saludos
Desde La Habana, Cuba
Medardo
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10346
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Agosto/2015 a las 19:58
Ahora que lo pienso ¿Y minimizar la aplicación de Access?



Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Medardo Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 03/Marzo/2005
Localización: Cuba
Estado: Sin conexión
Puntos: 1987
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Medardo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Agosto/2015 a las 20:51

Así mismo Mihura. No había pensado en eso. Esa puede ser una solución:

Me.WindowState = vbMinimized

Así queda el documento Word en primer plano. PERO… resulta que este programa será distribuido a todas las provincias y municipios del país. Estoy hablando de un poco más de 180 lugares. En ellos hay personas con conocimientos suficientes para darse cuenta que una aplicación está minimizada en la barra de tareas, pero desafortunadamente, no todos llegan hasta ahí. ¿Qué pasaría cuando algunos de éstos cierren el documento Word y no vean en la pantalla la aplicación? Podrá ser gracioso para nosotros, pero de que los hay, los hay.

Resulta Mihura, y seguro usted lo debe saber mejor que yo, que cuando un programa resulta fácil de hacer, el resultado para el cliente es difícil; pero, cuando el programador se quema las pestañas haciendo la programación bien difícil o compleja buscando lo mejor para el cliente, entonces éste encuentra fácil la aplicación. ¿Cuántas veces no nos ha pasado (al menos a mí) que buscando todas las posibles variantes en un solo procedimiento, nos ha costado días?

Bueno, como quiera que sea, me ha dado usted una idea que la tendré preparada para ver cuál de las dos variantes les resulta mejor al cliente (buscar en segundo plano o en la barra de tareas).

Gracias por todo Mihura.

Saludos
Desde La Habana, Cuba
Medardo
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Prisión Brieva
Estado: Sin conexión
Puntos: 3174
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Agosto/2015 a las 21:03
Hola Medardo:
Las pruebas que yo he hecho son con W7 y Word 2010, creo que con versiones posteriores de Word no funciona bien, supongo que eso será el problema.

Siento mucho que no funcione.
 
Un saludo.
 
 
Luis
Those are my principles, and if you don't like them... well, I have others. Groucho Marx
Arriba
prga Ver desplegable
Moderador
Moderador


Unido: 16/Noviembre/2004
Localización: España
Estado: Sin conexión
Puntos: 3045
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita prga Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Agosto/2015 a las 21:15
Hola.
Prueba añadiendo las dos líneas siguientes:
.....
AppInfWord.Application.Visible = True
Shell AppInfWord.Path & "\winword.exe", vbMaximizedFocus
AppInfWord.Documents(1).Close savechanges:=False

Aunque parezca raro, al menos a mí me 'funciona' en office 2010 y 2013
Ya comentas
Un saludo a todos
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable