elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Abrir ejecutable en un form - ¿Es posible abrir Chrome?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: Abrir ejecutable en un form - ¿Es posible abrir Chrome?  (Leído 17,843 veces)
NsTeam

Desconectado Desconectado

Mensajes: 127


Ver Perfil
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #20 en: 11 Febrero 2015, 00:08 am »

Hola, acabo de probarlo y aún así. Te explico lo que sucede.

Tengo Chrome abierto, está en pantalla completa pero minimizado, y al iniciar el proyecto.exe y por primera vez le doy click al "command_button", sólo abre la página en una nueva pestaña de Chrome y me muestra Chrome pero no lo incrusta al picture.

Cuando le doy nuevamente click al "Command_button", abre la página en otra nueva pestaña , me muestra chrome y recién la incrusta al picture.

Y después ya normal, cada vez que le doy click, abre Chrome y lo incrusta al picture y así sucesivamente.

(incluso probé el parameto de Chrome para que lo abra en una nueva ventana --new-window, pero nada, ese no era el problema)

Aquí te dejo el video de lo que te explico.



Lo que creo es que quizá en el FormLoad el código no carga bien ya que solamente al comienzo es que no lo incrusta al picture, pero después sí.

---------------------------------------------------------------------

Que curioso...
A mi me pasaba lo mismo pero con el otro programa de  inglés que te comenté, el que he incrustado en un form porque se muestra a pantalla completa y me oculta la barra de tareas. Es antiguo y de 16bits. Cuando se inicia sale un video y hay que hacer clic para iniciar el programa. El problema resultó ser porque incrustaba desde Form_Load. Parace ser que todo se tiene que hacer en un orden: Cargar form, cargar el otro programa, incrustar. Cuando se intenta hacer todo de golpe o no se le da el tiempo suficiente que se necesite para cualquiera de los tres pasos, se produce un fallo. He solucionado el problema haciendo que espere un segundo antes de ejecutar el código, a que le de tiempo a cargarse el form, antes de ejecutar el otro programa. Pero yo creo que el caso es distinto por que a ti el Chrome se te carga y no produce error. Siemplemente no se introduce en el Picture.

Prueba a hacer lo siguiente. Del mismo modo que nos hemos asegurado que obtenemos el handle de Chrome con el Do/Loop, hacemos otro Do/Loop para asegurarnos que Chrome se ha introducido en el Picture:

Código
  1. Do While N& = 0
  2. N& = SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
  3. DoEvents
  4. Loop

Si Chrome no se ha introducido en el Picture, N& tiene valor 0. Entonces vuelve a reintentar el proceso hasta que N& sea distinto de 0, es decir, que se haya introducido Chrome en el form.


Y dado que hay un bucle Loop y DoEvents es recomendable añadir en al Form_Unload el evento END.
Código
  1. Private Sub Form_Unload(Cancel As Integer)
  2.   Call Cerrar_Chrome(HWNDParent) 'Cierra Chrome
  3.   End
  4. End Sub

Esto es porque si el valor de N& fuera siempre 0 por no poder cargar Chrome, luego no podrías cerrar el form.

Dado que Do/Loop es un bucle que no termina nunca yo pondría, en cualqueira de los bucles un contador para que cuando por ejemplo llegase a X intentos, se parara el proceso y mostrara un mensaje informando de lo sucedido y saliera del bucle. En este caso ya no necesitarías poner END en Form_Unload.

Por cierto, si esto último no sirviera y a pesar de ello solucionas el problema, cuentame como lo has hecho o porqué te pasaba eso. No me dejes en ascuas.


Saludos




En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #21 en: 11 Febrero 2015, 16:43 pm »

Hola, acabo de probarlo y aún así. Te explico lo que sucede.

Tengo Chrome abierto, está en pantalla completa pero minimizado, y al iniciar el proyecto.exe y por primera vez le doy click al "command_button", sólo abre la página en una nueva pestaña de Chrome y me muestra Chrome pero no lo incrusta al picture.

Cuando le doy nuevamente click al "Command_button", abre la página en otra nueva pestaña , me muestra chrome y recién la incrusta al picture.

Y después ya normal, cada vez que le doy click, abre Chrome y lo incrusta al picture y así sucesivamente.

(incluso probé el parameto de Chrome para que lo abra en una nueva ventana --new-window, pero nada, ese no era el problema)

Aquí te dejo el video de lo que te explico.



Lo que creo es que quizá en el FormLoad el código no carga bien ya que solamente al comienzo es que no lo incrusta al picture, pero después sí.

---------------------------------------------------------------------





---------------------------------------------------------------------
Pues te juro que a mi no me pasa eso. He abierto Chrome, he ejecutado el programa ya compilado, fuera del entorno de programación. Le he dado al botón y se a incrustado con una nueva pestaña.


Cuando tengo problemas, lo que hago es crear puntos de interrupción. Lo único que has de hacer es Clic en la barrita vertical que hay en el lado izquierdo del código de vb6. Se pondrá un punto rojo. Luego le das a F5 (Iniciar). Entonces el programa se inicia y para el proceso en ese punto. Luego colocas el puntero sobre una variable del código y aparece una etiqueta que te indica el valor.




Puedes hacer un punto de interrupción debajo de:

Código
  1.   Do While HWNDParent = 0
  2.   HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  3.   DoEvents
  4.   Loop

No se pueden hacer puntos de interrupción en líneas vacias así que lo haces en la siguiente línea. Luego pones el puntero sobre HWNDParent, la primera vez que ejecutes la aplicación, y si pone 0 es que no ha obtenido el HWNDParent.  

Si no haces estas cosas vas un poco a ciegas. Porque no sabes lo que está ocurriendo en cada momento. Creo que es la única manera de encontrar una solución al problema.

No se si el tener el Windows7 pudiera tener algo que ver. Pero quien sabe.

El código lo voy a poner otra vez tal y como a mí me ha quedado al final. Porque entre tanta correción y tal pues es un poco lío.

Código
  1. 'Nombres de clase (ClassName) de Chrome
  2. 'Chrome_WidgetWin_1           <---Padre
  3. 'Chrome_RenderWidgetHostHWND  <---hijo
  4.  
  5. '//Funciones API para incrustar la aplicación en el picture
  6. Private Declare Function SetParent Lib "user32" _
  7. (ByVal hWndChild As Long, _
  8. ByVal HWNDParent As Long) As Long
  9. Private Declare Function ShowWindow Lib "user32" _
  10. (ByVal hwnd As Long, _
  11. ByVal nCmdShow As Long) As Long
  12. Private Declare Function SetWindowPos Lib "user32" _
  13. (ByVal hwnd As Long, _
  14. ByVal hWndInsertAfter As Long, ByVal x As Long, _
  15. ByVal y As Long, ByVal cx As Long, _
  16. ByVal cy As Long, _
  17. ByVal wFlags As Long) As Long
  18.  
  19. '//Funcion API para obtener el handle de la aplicación que se quiere menter en el Picture
  20. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  21. (ByVal lpClassName As String, _
  22. ByVal lpWindowName As String) As Long
  23.  
  24. '//Ejecuta el programa
  25. Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  26. (ByVal hwnd As Long, _
  27. ByVal lpOperation As String, _
  28. ByVal lpFile As String, _
  29. ByVal lpParameters As String, _
  30. ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  31.  
  32. '//Función para cerrar la aplicación incrustada
  33. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  34. (ByVal hwnd As Long, _
  35. ByVal wMsg As Long, _
  36. ByVal wParam As Long, _
  37. lParam As Any) As Long
  38.  
  39. Const SHOW_FULLSCREEN = 3
  40. Const SW_SHOWMINIMIZED = 2
  41. Const SW_SHOWMAXIMIZED = 3
  42. Const SWP_NOZORDER = &H4
  43. Const WM_SYSCOMMAND = &H112
  44. Const SC_CLOSE = &HF060&
  45.  
  46. '//////////////////////////////////////////////
  47. '//'Variable para el handle padre de Chrome  //
  48. '//Debe ser variable pública para que al     //
  49. '//cerrar el form únicamente se cierre el    //
  50. '//chrome incrustado en el picture y no      //
  51. '//otra ventana externa de chrome         /////
  52.        Dim HWNDParent As Long
  53. '//////////////////////////////////////////////
  54.  
  55. Private Sub Command1_Click()
  56. HWNDParent = 0
  57.   ShellExecute Me.hwnd, "", "chrome.exe", _
  58.    "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  59.   Espera (1)  'Espera 1 segundo a que se cargue
  60.   Do While HWNDParent = 0
  61.   HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  62.   DoEvents
  63.   Loop
  64.  
  65. Do While N& = 0
  66. N& = SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
  67. DoEvents
  68. Loop
  69.  
  70. 'Ajusta la ventana de Chrome al Picture
  71. Call SetWindowPos(HWNDParent, HWND_TOP, 0, 0, _
  72. Picture1.ScaleWidth, _
  73. Picture1.ScaleHeight, _
  74. SWP_NOZORDER)
  75. End Sub
  76. Private Sub Espera(Segundos As Single)
  77. Dim ComienzoSeg As Single
  78. Dim FinSeg As Single
  79. ComienzoSeg = Timer
  80. FinSeg = ComienzoSeg + Segundos
  81. Do While FinSeg > Timer
  82.     DoEvents
  83.     If ComienzoSeg > Timer Then
  84.         FinSeg = FinSeg - 24 * 60 * 60
  85.     End If
  86. Loop
  87. End Sub
  88.  
  89. Private Sub Cerrar_Chrome(hwnd As Long)
  90. If HWNDParent <> 0 Then
  91.    Call SetParent(HWNDParent, 0)  ' Libera el programa
  92.    Call SendMessage(HWNDParent, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) 'Cierra el programa
  93.    HWNDParent = 0
  94. End If
  95.   End Sub
  96. Private Sub Form_Load()
  97.    Picture1.ScaleMode = 3 'pixels <-importante para mover _
  98.     y establecer correctamente las dimensiones de la ventana _
  99.     de chrome dentro del picture
  100. End Sub
  101.  
  102. Private Sub Form_Unload(Cancel As Integer)
  103.   Call Cerrar_Chrome(HWNDParent) 'Cierra Chrome
  104.   End
  105. End Sub








« Última modificación: 13 Febrero 2015, 18:14 pm por okik » En línea

NsTeam

Desconectado Desconectado

Mensajes: 127


Ver Perfil
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #22 en: 11 Febrero 2015, 20:20 pm »

Hola, creo que ya di con el error, pero no estoy seguro. De todas formas hice lo que me dijiste y esto es lo que me mostró:



El programa en sí creo que sí obtiene el HWNDParent, ya que cuando lo pruebo directamente desde el Iniciar (F5), me funciona a la perfección.

Di con algo interesante:

Cuando ejecuto el proyecto.exe(compilado) y lo abro, sucede el problema; pero,

Si ejecuto el proyecto.exe(compilado) (pero tengo el Vb6 abierto, sin necesidad de que tenga código alguno) me funciona a la perfección



Lo he probado más de 10 veces y efectivamente cuando vb6 está abierto, me funciona a la perfección.

Aquí te dejo un video de lo que me sucede, y no sólo sucede en mi PC y mi laptop, también en todas las PC que lo probé



Otra cosa del cuál me he dado cuenta es que cuando el VB6 está abierto, la barra de tareas se cambia de color y me aparece el mensaje de:



Y cuando no tengo el VB6 abierto, la barra de tareas cambia a su normalidad.



Aunque no creo que esto tenga nada que ver.


« Última modificación: 11 Febrero 2015, 22:54 pm por NsTeam » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #23 en: 12 Febrero 2015, 17:25 pm »

VB6 ya que da un poco viejo para Windows7. Además tu Windows es de 64 bits y VB6 es de 32. Tu Chrome también debe ser una versión de 64bits.

Creo que cosas así te van a ocurrir constantemente si mezclas ambas cosas VB6 y W7 64bits.

Lo que voy ha hacer, por mera curiosidad, es instalarme en VirtualBox el Windows7 64bits y probar el programa, a ver que pasa.

Mientras, se me ocurre que ejecutes el programa con "Compatibilidad con win 98 o XP" y a ver que pasa. No se me ocurre otra cosa. 

Pudiera ser que cuando se ejecuta VB6 se activa algún servicio de compatibilidad y cuando se cierra  VB6 se desactiva. Pero solo son suposiciones mías.

No se si tienes VB.NET, pero si no lo usas y  vas a crear programas para W7 64bits ya pudieras ir pensando en cambiar a VB.Net. Yo he usado VB6 durante más de 10 años, como aficionado, pero ahora he empezado con VB.Net2010. Al principio cuesta un poco, por que ha cambiado mucho, pero poco a poco vas aprendiendo. De echo el programa para incrustar el curso de ingles que te comenté lo hice con VB.Net2010.

Probaré el programa en las dos versiones, a ver que pasa...
En línea

NsTeam

Desconectado Desconectado

Mensajes: 127


Ver Perfil
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #24 en: 12 Febrero 2015, 17:53 pm »

VB6 ya que da un poco viejo para Windows7. Además tu Windows es de 64 bits y VB6 es de 32. Tu Chrome también debe ser una versión de 64bits.

Creo que cosas así te van a ocurrir constantemente si mezclas ambas cosas VB6 y W7 64bits.

Lo que voy ha hacer, por mera curiosidad, es instalarme en VirtualBox el Windows7 64bits y probar el programa, a ver que pasa.

Mientras, se me ocurre que ejecutes el programa con "Compatibilidad con win 98 o XP" y a ver que pasa. No se me ocurre otra cosa. 

Pudiera ser que cuando se ejecuta VB6 se activa algún servicio de compatibilidad y cuando se cierra  VB6 se desactiva. Pero solo son suposiciones mías.

No se si tienes VB.NET, pero si no lo usas y  vas a crear programas para W7 64bits ya pudieras ir pensando en cambiar a VB.Net. Yo he usado VB6 durante más de 10 años, como aficionado, pero ahora he empezado con VB.Net2010. Al principio cuesta un poco, por que ha cambiado mucho, pero poco a poco vas aprendiendo. De echo el programa para incrustar el curso de ingles que te comenté lo hice con VB.Net2010.

Probaré el programa en las dos versiones, a ver que pasa...


Gracias por tu respuesta, probé con conpatibilidad de win98 y Win XP, pero aún así, sigue surgiendo el mismo problema y no tengo instalado VB.NET sólo Vb6.

Espero puedas decirme qué tal te fue cuando instalaste el W7 64 bits.

Saludos!
En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #25 en: 13 Febrero 2015, 18:35 pm »

Bueno compañero, aquí estoy de nuevo. He ejecutado el programa bajo las siguientes condiciones:

- Máquina:    VirtualBox
- SO:       Windows 7 Enterprise SP1 64 bits
- Chrome:    Google Chrome Versión 40.0.2214.111 m (última)

Y estamos donde estábamos, porque a mi me sigue funcionando perfectamente salvo un excepción: Chrome se incrusta mostrando una pestaña de color negro. Para solucionarlo he añadido ShowWindow en el código para  refrescar la ventanan de Chrome con SW_RESTORE.También ocurre que tarda un poco en mostrarse, pero también es verdad que W7 me va algo lento en el VirtualBox. Supongo que será por eso.

Esperaba que me pasara lo mismo que a ti y luego intentar solucionar el problema pero no ha sido así.


Para corregir el problema de visualización, como he dicho antes  he añadido "ShowWindow HWNDParent, SW_RESTORE"(línea 18))

Código
  1. Const SW_RESTORE = 9



Código
  1. Private Sub Command1_Click()
  2. HWNDParent = 0
  3.   ShellExecute Me.hwnd, "", "chrome.exe", _
  4.    "http://www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  5.   Espera (1) 'Espera un segundo a que se cargue Chrome
  6.   Do While HWNDParent = 0
  7.   HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  8.   DoEvents
  9.   Loop
  10.  
  11. Do While N& = 0
  12. N& = SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
  13. DoEvents
  14. Loop
  15.  
  16.  
  17. 'Refresca Chrome por si no se visualiza correctamente
  18. ShowWindow HWNDParent, SW_RESTORE
  19.  
  20. 'Ajusta la ventana de Chrome al Picture
  21. Call SetWindowPos(HWNDParent, HWND_TOP, 0, 0, _
  22. Picture1.ScaleWidth, _
  23. Picture1.ScaleHeight, _
  24. SWP_NOZORDER)
  25.  
  26. End Sub
  27.  


A ver si lo averiguas o alguien sabe algo y te contesta de porqué este fallo. Incluso que haya otra forma de hacerlo. ¿Por qué no pruebas con Firefox? Yo ya no puedo aportar nada más.

Por cierto, si no quieres que se cree una pestaña nueva sustituye "http://www.elhacker.net" por vbNullString en ShellExecute. Yo lo puse como demostración, pero si no quieres ponerlo pues no hace falta.
« Última modificación: 13 Febrero 2015, 18:38 pm por okik » En línea

NsTeam

Desconectado Desconectado

Mensajes: 127


Ver Perfil
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #26 en: 13 Febrero 2015, 21:47 pm »

Hola, lo probé y aún así persiste el problema, lo curioso es que cuando al proyecto.exe le doy a compatibilidad - configuracion - ejecutar con 256 colores, ahí sí , se soluciona el problema.

Otra cosa que me di cuenta es que sólo pasa con mi PC y mi laptop que tienen Windows 7 'registrado', cuando lo probé en otra PC que tiene W7 pero no lo tiene registrado, entonces lo abre normal.

En mi PC y mi Laptop, el borde del navegador Chrome, es color negro
En la otra PC, el borde del navegador es Azul,

Estoy seguro que en el virtualbox que tienes, cuando abres Chrome, el borde es de color azul (como en la PC que lo probe que no tiene W7 registrado), en cambio en mi PC y mi laptop el borde es de color negro.

Quería consultarte algo que mencionaste al final, lo de sustituir "http://www.elhacker.net" por vbNullString, lo hice y efectivamente me abre chrome en una nueva ventana, pero ¿Cómo hago para que en esa nueva ventana abra http://elhacker.net?


Bueno compañero, aquí estoy de nuevo. He ejecutado el programa bajo las siguientes condiciones:

- Máquina:    VirtualBox
- SO:       Windows 7 Enterprise SP1 64 bits
- Chrome:    Google Chrome Versión 40.0.2214.111 m (última)

Y estamos donde estábamos, porque a mi me sigue funcionando perfectamente salvo un excepción: Chrome se incrusta mostrando una pestaña de color negro. Para solucionarlo he añadido ShowWindow en el código para  refrescar la ventanan de Chrome con SW_RESTORE.También ocurre que tarda un poco en mostrarse, pero también es verdad que W7 me va algo lento en el VirtualBox. Supongo que será por eso.

Esperaba que me pasara lo mismo que a ti y luego intentar solucionar el problema pero no ha sido así.


Para corregir el problema de visualización, como he dicho antes  he añadido "ShowWindow HWNDParent, SW_RESTORE"(línea 18))

Código
  1. Const SW_RESTORE = 9



Código
  1. Private Sub Command1_Click()
  2. HWNDParent = 0
  3.   ShellExecute Me.hwnd, "", "chrome.exe", _
  4.    "http://www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  5.   Espera (1) 'Espera un segundo a que se cargue Chrome
  6.   Do While HWNDParent = 0
  7.   HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  8.   DoEvents
  9.   Loop
  10.  
  11. Do While N& = 0
  12. N& = SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
  13. DoEvents
  14. Loop
  15.  
  16.  
  17. 'Refresca Chrome por si no se visualiza correctamente
  18. ShowWindow HWNDParent, SW_RESTORE
  19.  
  20. 'Ajusta la ventana de Chrome al Picture
  21. Call SetWindowPos(HWNDParent, HWND_TOP, 0, 0, _
  22. Picture1.ScaleWidth, _
  23. Picture1.ScaleHeight, _
  24. SWP_NOZORDER)
  25.  
  26. End Sub
  27.  


A ver si lo averiguas o alguien sabe algo y te contesta de porqué este fallo. Incluso que haya otra forma de hacerlo. ¿Por qué no pruebas con Firefox? Yo ya no puedo aportar nada más.

Por cierto, si no quieres que se cree una pestaña nueva sustituye "http://www.elhacker.net" por vbNullString en ShellExecute. Yo lo puse como demostración, pero si no quieres ponerlo pues no hace falta.

En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #27 en: 17 Febrero 2015, 19:56 pm »

Es increible que con la de gente que ha entrado a ver este post sobre tu pregunta, nadie haya encontrado la razón de tu problema desde que lo planteaste.

Pues resulta que el problema es la composición del escritorio. Yo en el portatil tengo Vista sin la composición de escritorio y transparencia porque usa mucha memoria y el rendimiento es menor. Y en Windows 7 como lo instalé en VirtualBox no se puede habilitar la composición de escritorio ni las transparencias.

La composición de escritorio es lo que permite crear efectos de brillo de las ventanas y las trasparencias. Esto es en Vista y Windows7 si lo tienes con la mejor apariencia. Prueba a cambiar el tema del escritorio a windows clásico o quitar las transparéncias. Seguro que si haces eso no tienes problemas.


Ayer caí en la cuenta que si Chrome se ve transperente o con efecto de brillo por la composición de escritorio ¿que pasará cuando lo meta en el Picture en una aplicación creada con VB6?. Cuando lo incrusto en el Picture se pone negro, como tu decías. Además, no se incrusta en el Picture cuando ya se ha abierto previamente también como tu decías, pero sí la segunda vez. Así que el problema es por tener habilitada la composición de escritorio. Ocurre lo mismo con VB.net.

Por alguna razón que no entiendo, aunque encuentra el Handle no lo incrusta. Así que he recurrido a un código más pesado. He creado un Módulo con el siguiente código:

Código para un Módulo

Código
  1. Option Explicit
  2.  
  3. 'Constantes
  4. '-----------------------------------
  5. Const TH32CS_SNAPHEAPLIST = &H1
  6. Const TH32CS_SNAPPROCESS = &H2
  7. Const TH32CS_SNAPTHREAD = &H4
  8. Const TH32CS_SNAPMODULE = &H8
  9. Const TH32CS_SNAPALL = _
  10. (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or _
  11. TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
  12. Const TH32CS_INHERIT = &H80000000
  13. Const MAX_PATH As Integer = 260
  14.  
  15. Private Declare Function GetPriorityClass Lib "kernel32" _
  16. (ByVal hProcess As Long) As Long
  17.  
  18. 'Estructura para los procesos
  19. '-----------------------------------
  20. Private Type PROCESSENTRY32
  21.    dwSize As Long
  22.    cntUsage As Long
  23.    th32ProcessID As Long
  24.    th32DefaultHeapID As Long
  25.    th32ModuleID As Long
  26.    cntThreads As Long
  27.    th32ParentProcessID As Long
  28.    pcPriClassBase As Long
  29.    dwFlags As Long ' Flags 'Reservado; no usar.
  30.    szExeFile As String * MAX_PATH
  31. End Type
  32.  
  33. 'Funciones Api para listar los procesos
  34. '--------------------------------------------------------
  35. Private Declare Function CreateToolhelp32Snapshot Lib _
  36. "kernel32" _
  37. (ByVal lFlags As Long, _
  38. ByVal lProcessID As Long) As Long
  39. Private Declare Function Process32First Lib "kernel32" _
  40. (ByVal hSnapShot As Long, _
  41. uProcess As PROCESSENTRY32) As Long
  42. Private Declare Function _
  43. Process32Next Lib "kernel32" _
  44. (ByVal hSnapShot As Long, _
  45. uProcess As PROCESSENTRY32) As Long
  46. Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
  47. (ByVal hwnd As Long, _
  48. ByVal lpClassName As String, _
  49. ByVal nMaxCount As Long) As Long
  50. Private Declare Function IsWindow Lib "user32" _
  51. (ByVal hwnd As Long) As Long
  52.  
  53.  
  54.  
  55. Public Const GW_HWNDNEXT = 2
  56.  
  57. Public Declare Function GetParent Lib "user32" _
  58. (ByVal hwnd As Long) As Long
  59. Public Declare Function GetWindow Lib "user32" _
  60. (ByVal hwnd As Long, ByVal wCmd As Long) As Long
  61. Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  62. (ByVal lpClassName As String, _
  63. ByVal lpWindowName As String) As Long
  64. Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
  65. (ByVal hwnd As Long, _
  66. ByVal lpString As String, ByVal cch As Long) As Long
  67. Public Declare Function GetWindowThreadProcessId Lib "user32" _
  68. (ByVal hwnd As Long, _
  69. lpdwprocessid As Long) As Long
  70.  
  71. Public Function ProcIDFromWnd(ByVal hwnd As Long) As Long
  72.   Dim idProc As Long
  73.   GetWindowThreadProcessId hwnd, idProc
  74.   ProcIDFromWnd = idProc
  75. End Function
  76.  
  77. Public Function GetWinHandle(hInstance As Long) As Long
  78.   Dim tempHwnd As Long
  79.   tempHwnd = FindWindow(vbNullString, vbNullString)
  80.   Do Until tempHwnd = 0
  81.      If GetParent(tempHwnd) = 0 Then
  82.         If hInstance = ProcIDFromWnd(tempHwnd) Then
  83.            GetWinHandle = tempHwnd
  84.            Exit Do
  85.         End If
  86.      End If
  87.      tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT)
  88.   Loop
  89. End Function
  90.  
  91.  
  92. Public Function BuscarHandleChrome() As Long
  93. Dim F As Long, r As Long, x As Long
  94. Dim sWindowText As String * 255 'Variable para introducir el texto de una barra con espacios
  95. Dim sClassName As String * 255
  96. Dim hSnapShot As Long
  97. Dim Name As String * 255
  98. Dim uProcess As PROCESSENTRY32
  99. Dim elemento As ListBox
  100. Dim sTextoBarra As String
  101. Dim sNombreClase As String
  102. Dim shwnd As Long
  103. hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
  104. uProcess.dwSize = Len(uProcess)
  105. r = Process32First(hSnapShot, uProcess)
  106.  
  107. Do While r > 0
  108.    r = Process32Next(hSnapShot, uProcess)
  109.    shwnd = GetWinHandle(uProcess.th32ProcessID)
  110.    x = GetClassName(shwnd, sClassName, 255)
  111.    sNombreClase = Left(sClassName, x) '<<----Nombre de Clase
  112.  
  113. If Trim(sNombreClase) <> "" Then
  114.  If IsWindow(shwnd) = 1 Then 'si es una aplicación visible
  115.    If IsWindow(shwnd) Then
  116.        If sNombreClase = "Chrome_WidgetWin_1" Then BuscarHandleChrome = shwnd
  117.    End If
  118. End If
  119. End If
  120. Loop
  121. End Function
  122.  

Lo que hace es listar las aplicaciones que se están ejecutando y si encuentra una con el nombre de clase "Chrome_WidgetWin_1" entonces introduce el handle en la variable HWNDParent.


Para el Form el siguiente código:
- Añadir un Picture
- Añadir un Botón
- Añadir un control Timer

Código
  1. Option Explicit
  2. 'Nombres de clase (ClassName) de Chrome
  3. 'Chrome_WidgetWin_1           <---Padre
  4. 'Chrome_RenderWidgetHostHWND  <---hijo
  5.  
  6. '//Funciones API para incrustar la aplicación en el picture
  7. Private Declare Function SetParent Lib "user32" _
  8. (ByVal hWndChild As Long, _
  9. ByVal HWNDParent As Long) As Long
  10. Private Declare Function ShowWindow Lib "user32" _
  11. (ByVal hwnd As Long, _
  12. ByVal nCmdShow As Long) As Long
  13. Private Declare Function SetWindowPos Lib "user32" _
  14. (ByVal hwnd As Long, _
  15. ByVal hWndInsertAfter As Long, ByVal x As Long, _
  16. ByVal Y As Long, ByVal cx As Long, _
  17. ByVal cy As Long, _
  18. ByVal wFlags As Long) As Long
  19.  
  20.  
  21. '//Ejecuta el programa
  22. Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  23. (ByVal hwnd As Long, _
  24. ByVal lpOperation As String, _
  25. ByVal lpFile As String, _
  26. ByVal lpParameters As String, _
  27. ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  28.  
  29.  
  30. '//Función para cerrar la aplicación incrustada
  31. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  32. (ByVal hwnd As Long, _
  33. ByVal wMsg As Long, _
  34. ByVal wParam As Long, _
  35. lParam As Any) As Long
  36.  
  37. Const SW_SHOWNORMAL = 1
  38. Const SW_RESTORE = 9
  39. Const SWP_NOZORDER = &H4
  40.  
  41. Const HWND_TOP = 0
  42. Const WM_SYSCOMMAND = &H112
  43. Const SC_CLOSE = &HF060&
  44.    ' Función api SetWindowTheme
  45.    Private Declare Function SetWindowTheme Lib "UxTheme.dll" ( _
  46.        ByVal hwnd As Long, _
  47.        ByVal pszSubAppName As Long, _
  48.        ByVal pszSubIdList As Long) As Long
  49.        Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
  50.  
  51. '//////////////////////////////////////////////
  52. '//'Variable para el handle padre de Chrome  //
  53. '//Debe ser variable pública para que al     //
  54. '//cerrar el form únicamente se cierre el    //
  55. '//chrome incrustado en el picture y no      //
  56. '//otra ventana externa de chrome         /////
  57.        Dim HWNDParent As Long
  58. '//////////////////////////////////////////////
  59. Dim N&
  60. Private Sub Command1_Click()
  61.  
  62. If N& = 0 Then ' Si no hay nada dentro del Picture ejecuta el código
  63.   'ShellExecute Me.hWnd, "open", "chrome.exe", _
  64.     "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWNORMAL
  65. Shell Environ("programfiles") & "\Google\Chrome\Application\" & "chrome.exe", vbNormalFocus
  66.   Do While HWNDParent = 0
  67.   HWNDParent = BuscarHandleChrome
  68.   DoEvents
  69. Loop
  70.  
  71. Do While N& = 0
  72. N& = SetParent(HWNDParent, Picture1.hwnd) 'Meter la apclicación en el picture
  73. DoEvents
  74. Loop
  75.  
  76. 'Refresca Chrome por si no se visualiza correctamente
  77. ShowWindow HWNDParent, SW_RESTORE
  78.  
  79. 'Ajusta la ventana de Chrome al Picture
  80. Call SetWindowPos(HWNDParent, HWND_TOP, 0, 0, _
  81. Picture1.ScaleWidth, _
  82. Picture1.ScaleHeight, _
  83. SWP_NOZORDER)
  84. End If
  85.  
  86. End Sub
  87.  
  88. Private Sub Cerrar_Chrome(hwnd As Long)
  89. If HWNDParent <> 0 Then
  90.    Call SetParent(HWNDParent, 0)  ' Libera el programa
  91.    Call SendMessage(HWNDParent, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) 'Cierra el programa
  92.    HWNDParent = 0
  93. End If
  94.   End Sub
  95. Private Sub Form_Load()
  96.    Picture1.ScaleMode = 3 'pixels <-importante para mover _
  97.     y establecer correctamente las dimensiones de la ventana _
  98.     de chrome dentro del picture
  99.    Timer1.Interval = 1
  100.    Timer1.Enabled = True
  101. End Sub
  102.  
  103. Private Sub Form_Unload(Cancel As Integer)
  104.   Call Cerrar_Chrome(HWNDParent) 'Cierra Chrome
  105.   End
  106. End Sub
  107. Private Sub Timer1_Timer()
  108. Dim x
  109. x = IsWindow(HWNDParent)
  110. If x = 0 Then
  111. N& = 0
  112. HWNDParent = 0
  113. End If
  114. End Sub
  115.  
  116.  


Ahora no falla. El problema que surge ahora es que se ve mal cuando está activada la composición de escritorio. Eso si que ya no tengo ni idea de como arreglarlo.

He probado usando  SetWindowTheme para cambiar el estilo de la ventana de Chrome a Windows Clásico. Pero ni por esas, porque aunque sí lo convierte a Windows clásico, continúa estando habilitada la composición de escritorio en la ventana de Chrome. Por eso se ve negro. Creo que la única manera de que se vea bien es utilizando algún código, si existe,  que quite la composición del escritorio sólo en la ventana incrustada.


Si te fijas he anulado ShellExecute porque da problemas. Compruebalo tu mismo.
si quieres que abra en un determinada página con shell, basta con añadir la página después de "Chrome.exe" separado por un espacio.

Ejemplo:

Shell Environ("programfiles") & "\Google\Chrome\Application\" & _
"chrome.exe www.google.co.uk", vbNormalFocus

También:

Shell Environ("programfiles") & "\Google\Chrome\Application\" & _
"chrome.exe "  & "www.google.co.uk", vbNormalFocus


Esta aplicación en principio no sirve para nada, se trata de un ejemplo y luego cada cual lo use, lo arregle, lo modifique y lo mejore como le de la gana si le sirve. A mí me ha servido para viejas apliaciones de 16bits que se me ejecutaban a patanalla completa: cursos de inglés y enciclopedias. Que aunque son viejas apliaciones contienen información muy útil y las sigo usando de vez en cuando. Según lo que sea  habrá que cambiar alguna cosa que otra del código. Las correcciones están pensadas para Chrome pero otras aplicaciones no dan los mismos problemas.


Pues así lo dejo para quien le sirva...
























  
« Última modificación: 4 Marzo 2015, 10:59 am por okik » En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Abrir nuevo Form C++
.NET (C#, VB.NET, ASP)
Lokoo 1 9,622 Último mensaje 10 Noviembre 2008, 22:16 pm
por BETA_V
Abrir un form desde otro form con netbeans en java
Java
murdock_ 3 47,248 Último mensaje 1 Enero 2009, 03:44 am
por sapito169
Efecto al abrir el Form
Programación Visual Basic
Nardo[N] 5 7,580 Último mensaje 10 Febrero 2011, 01:51 am
por Nardo[N]
Abrir ejecutable al abrir una carpeta
Windows
Kurolox 2 3,517 Último mensaje 15 Julio 2014, 20:54 pm
por Eleкtro
Abrir Chrome dentro de un form
Programación Visual Basic
NsTeam 4 8,520 Último mensaje 3 Febrero 2015, 13:49 pm
por okik
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines