Foco de una ventana

Iniciado por Yekka, 26 Octubre 2007, 21:42 PM

0 Miembros y 2 Visitantes están viendo este tema.

Yekka

 Hola foro, ¿como se puede hacer para darle el foco a una ventana que no lo tenga?

HaDeS, -

Código (vb) [Seleccionar]

Ventana.SetFocus

Si la ventana es de la misma aplicación, si es una aplicación externa puedes usar esta api:
Código (vb) [Seleccionar]

Private Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long


Saludos ;)

Yekka

  Es posible un ejemplo, suponiendo que solo tengo el caption o el nombre de la ventana, "me refiero al focus de una aplicacion externa".

HaDeS, -

Weno, cambio de estrategia, utilize la api findwindow y showwindow para hacer el focus en la ventana
Código (vb) [Seleccionar]

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Sub Command1_Click()
    Focus "escritorio"
End Sub

Private Sub Focus(titulo$)
Dim hwndventana&
hwndventana = FindWindow(vbNullString, titulo)
If hwndventana <> 0 Then
    ShowWindow hwndventana, 1
End If
End Sub


Saludos ;)

Yekka

   Gracias me funciono bien, estoy haciendo un proyecto que abra un .doc bajo contraseña, luego lo llamo con la rutina "Focus" en caso de que lo pierda y le envio la clave con SendKeys.

  Otra pregunta, no se si me salgo del tema. ¿Como se puede hacer para que una ventana siempre este visble, a pesar de que pierda el focus? ej: como el administrador de tareas de windows, una vez activo, siempre estara visible, como los programas de administracion de redes que usan los ciber-cafe.

HaDeS, -

mm, lo que queres es hacer un tipo de bruteforce no?, mira este código que creo que funciona para word, lo probe con word 2000:
Código (vb) [Seleccionar]

Private Sub Command1_Click()
On Error GoTo Error
Dim Archivo$
Archivo = "c:\documento.doc"
If Dir$(Archivo) = "" Then Exit Sub
Dim Word As Object, Docu As Object
Set Word = CreateObject("Word.Application")
Set Docu = Word.Documents.Open(Archivo, , , , "1234")
Word.Documents.Close
Set Word = Nothing
Set Docu = Nothing
MsgBox "Password Correcto"
Exit Sub
Error:
If Err.Description <> "" Then
    MsgBox "Password Incorrecto"
End If
End Sub

Crea un objeto de word, abre el documento e intenta meter la contraseña, si hay un error es porque la contraseña esta mala, si no hay error es porque la contraseña es buena.

Y con respecto a que esté siempre visible podes probar esto:
Código (vb) [Seleccionar]

Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Private Sub Form_Load()
    SetWindowPos Me.hWnd, -1, 0, 0, 0, 0, &H1 Or &H2
End Sub


Saludos ;)

Yekka

#6
 Bien, con respecto al codigo que abre word, lo probre en office 2003, abre word, envia la contraseña, y luego me da el mensaje que indica 'password correcto', pero no abre el documento, no se si me explico, no aparece lo que esta escrito en el mismo.

Con respecto al segundo code, funciona bien gracias, sobre todo por la velocidad de respuesta que das.   

HaDeS, -

No tengo idea porque pasa eso, debe ser por la diferencia de versiones del word... voy a averiguar, y luego si tengo la respuesta te la posteo.
Saludos ;)

Yekka

#8
   Hola HaDeS, utilizando tu ejemplo de abrir un .Doc pero aplicandolo para abrir un .Pps, me da un error. fijate en esto:

CitarError '438' en tiempo de ejecucion:
El objeto no admite esta propiedad o método

Este es tu code adaptado:
Código (vb) [Seleccionar]
[code]
Archivo = "c:\Diapositiva.pps"

Dim Documento As Object, ObjPowerPoint As Object
   
Set ObjPowerPoint = CreateObject("PowerPoint.Application")
   
Set Documento = ObjPowerPoint.presentacion.Open(Archivo, , , , "1234")'--> Error
   
ObjPowerPoint.presentacion.Close 'Cerrando el objeto
   
Set ObjPowerPoint = Nothing
Set Documento = Nothing
[/code]

   Osea, la idea en este caso, es abrir un .pps bajo contraseña, de momento yo estoy haciendo esto:

Dim Res As Long
Res = ShellExecute(Me.hwnd, "Open", App.Path & "\Multimedia\Diapositivas\Duaca.pps", "", "", 1)

NombreVentana = "Contraseña"

If FindWindow(vbNullString, ByVal NombreVentana) Then
        Focus NombreVentana 'Tu rutina Focus
        SendKeys "1234"
        SendKeys "{TAB}"
        SendKeys "{ENTER}"
End If




   De momento, el code funciona, lo ejecuto, busco haber si la ventana esta activa, le doy foco y le envio la contraseña. Todo bien, pero si se cliquea en otra ventana en pleno procedimiento, la contraseña no llega a su destino, me explico: se abre el documento pero queda en espera del password de apertura.

  Lo que necesito saber, es si como lo estoy haciendo esta bien y si sabes como puedo corregir ese problema o si por el contrario, crees que tu ejemplo de abrir office, es mas efectivo, en ese caso dime que puedo hacer para corregirr el error en tiempo de ejecucuion que me da tu ejemplo adptado a .pps.

   Un poco enrredado todo lo que dije, ¿verdad?  :-(.
Código (vb) [Seleccionar]
[code=vb][/code]

HaDeS, -

Buenas!!, jeje pues, no estuvo tan enredado, estuve buscando acerca del objeto de powerpoint y tenes dos errores en tú código
Código (vb) [Seleccionar]

Set Documento = ObjPowerPoint.presentacion.Open(Archivo, , , , "1234")'--> Error
   
ObjPowerPoint.presentacion.Close 'Cerrando el objeto

sería:
Código (vb) [Seleccionar]

Set Documento = ObjPowerPoint.Presentations.Open(Archivo, , , , "1234")'--> Error
   
ObjPowerPoint.Presentations.Close 'Cerrando el objeto


Pero, eso no arregla todo el problema, al parecer el método Open del objeto powerpoint no admite el campo pass, por lo que el código igualmente quedaría inútil.

Como va esto, creo que es mejor que utilizes la forma de obtener el foco de la ventana y con la sendkeys mandar la clave y luego tab , enter.

Si no te funciona bien agrega un DoEvents luego de que obtiene el foco de la ventana, asi se asegura que después de obtener el foco se envien las teclas.

Si queres saber más sobre el tema de objetos office y visual, mira esta página: http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/office97/html/web/FULLTOC.asp


Saludos :)