Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Yekka en 26 Octubre 2007, 21:42 pm



Título: Foco de una ventana
Publicado por: Yekka en 26 Octubre 2007, 21:42 pm
 Hola foro, ¿como se puede hacer para darle el foco a una ventana que no lo tenga?


Título: Re: Foco de una ventana
Publicado por: HaDeS, - en 26 Octubre 2007, 22:05 pm
Código
  1. Ventana.SetFocus
  2.  
Si la ventana es de la misma aplicación, si es una aplicación externa puedes usar esta api:
Código
  1. Private Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
  2.  

Saludos ;)


Título: Re: Foco de una ventana
Publicado por: Yekka en 27 Octubre 2007, 03:59 am
  Es posible un ejemplo, suponiendo que solo tengo el caption o el nombre de la ventana, "me refiero al focus de una aplicacion externa".


Título: Re: Foco de una ventana
Publicado por: HaDeS, - en 27 Octubre 2007, 04:35 am
Weno, cambio de estrategia, utilize la api findwindow y showwindow para hacer el focus en la ventana
Código
  1. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  2. Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
  3.  
  4. Private Sub Command1_Click()
  5.    Focus "escritorio"
  6. End Sub
  7.  
  8. Private Sub Focus(titulo$)
  9. Dim hwndventana&
  10. hwndventana = FindWindow(vbNullString, titulo)
  11. If hwndventana <> 0 Then
  12.    ShowWindow hwndventana, 1
  13. End If
  14. End Sub
  15.  

Saludos ;)


Título: Re: Foco de una ventana
Publicado por: Yekka en 27 Octubre 2007, 05:31 am
   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.


Título: Re: Foco de una ventana
Publicado por: HaDeS, - en 27 Octubre 2007, 07:07 am
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
  1. Private Sub Command1_Click()
  2. On Error GoTo Error
  3. Dim Archivo$
  4. Archivo = "c:\documento.doc"
  5. If Dir$(Archivo) = "" Then Exit Sub
  6. Dim Word As Object, Docu As Object
  7. Set Word = CreateObject("Word.Application")
  8. Set Docu = Word.Documents.Open(Archivo, , , , "1234")
  9. Word.Documents.Close
  10. Set Word = Nothing
  11. Set Docu = Nothing
  12. MsgBox "Password Correcto"
  13. Exit Sub
  14. Error:
  15. If Err.Description <> "" Then
  16.    MsgBox "Password Incorrecto"
  17. End If
  18. End Sub
  19.  
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
  1. 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)
  2.  
  3. Private Sub Form_Load()
  4.    SetWindowPos Me.hWnd, -1, 0, 0, 0, 0, &H1 Or &H2
  5. End Sub
  6.  

Saludos ;)


Título: Re: Foco de una ventana
Publicado por: Yekka en 27 Octubre 2007, 17:27 pm
 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.   


Título: Re: Foco de una ventana
Publicado por: HaDeS, - en 27 Octubre 2007, 21:51 pm
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 ;)


Título: Re: Foco de una ventana
Publicado por: Yekka en 28 Octubre 2007, 17:54 pm
   Hola HaDeS, utilizando tu ejemplo de abrir un .Doc pero aplicandolo para abrir un .Pps, me da un error. fijate en esto:

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

Este es tu code adaptado:
Código
  1. [code]
  2. Archivo = "c:\Diapositiva.pps"
  3.  
  4. Dim Documento As Object, ObjPowerPoint As Object
  5.  
  6. Set ObjPowerPoint = CreateObject("PowerPoint.Application")
  7.  
  8. Set Documento = ObjPowerPoint.presentacion.Open(Archivo, , , , "1234")'--> Error
  9.  
  10. ObjPowerPoint.presentacion.Close 'Cerrando el objeto
  11.  
  12. Set ObjPowerPoint = Nothing
  13. Set Documento = Nothing
[/code]

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

Código:
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
  1. [code=vb]
[/code]


Título: Re: Foco de una ventana
Publicado por: HaDeS, - en 28 Octubre 2007, 22:37 pm
Buenas!!, jeje pues, no estuvo tan enredado, estuve buscando acerca del objeto de powerpoint y tenes dos errores en tú código
Código
  1. Set Documento = ObjPowerPoint.presentacion.Open(Archivo, , , , "1234")'--> Error
  2.  
  3. ObjPowerPoint.presentacion.Close 'Cerrando el objeto
  4.  
sería:
Código
  1. Set Documento = ObjPowerPoint.Presentations.Open(Archivo, , , , "1234")'--> Error
  2.  
  3. ObjPowerPoint.Presentations.Close 'Cerrando el objeto
  4.  

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


Título: Re: Foco de una ventana
Publicado por: Yekka en 29 Octubre 2007, 02:34 am
  Gracias, con el DoEvents se minimiza el problema, aunque no se elimina. Pero igula he dado un paso mas en mi proyecto.

  Espero algun dia saber tanto como tu y poder asi responder con tanta seguridad y acertada en lasa respuestas.

 ¡Bye!  :-*