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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  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 13,003 veces)
seba123neo
Moderador
***
Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Abrir ejecutable en un form - ¿Es posible abrir Chrome?
« Respuesta #10 en: 4 Febrero 2015, 16:13 pm »

la rurta del chrome esta en:

Código:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome

o en 64 bits:

Código:
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome


En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
NsTeam

Desconectado Desconectado

Mensajes: 125


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

Si claro que se puede. Se me ocurren varias maneras.

Pero antes de nada permíteme corregir unas líneas del código que te he dado antes. Hice un copia y pega de mi propio código en Form_Unload y se han colado un par de líneas que no tienen utilidad ahí, se trata de la variable hWndChild   que fue un intento de introducir sólamente la Web en el Picture, funcionaba con el Notepad por ejemplo, pero no con Google Chrome. Lo borré en otras partes del código, pero no en el Form_Load, se me pasó. También está lo de Espera(5) que si que es necesario más arriba, porque hay que esperar a que se cargue Google Chrome antes de introducirlo en el Picture, pero para cerrar no hace falta.

Código
  1. Private Sub Form_Unload(Cancel As Integer)
  2.    Dim hwnd As Long
  3.    Dim hWndChild As Long  '<---- BORRAR ESTA LÍNEA
  4.    'Espera (5) '<---- BORRAR ESTA LÍNEA
  5.    hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)
  6.    Call Cerrar_Google(hwnd) 'cierra Google
  7. End Sub

Debería ser así:

Código
  1. Private Sub Form_Unload(Cancel As Integer)
  2.    Dim hwnd As Long
  3.    hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)
  4.    Call Cerrar_Google(hwnd) 'cierra Google
  5. End Sub

En cuanto a lo de
- Primera opción: Crear un código de busqueda de Chrome.exe y obtener su directorio (ideal para programas que al actualizarse van cambiando la ubicación) por ejemplo si fuera "\Google\Chrome\Application\V0014\Chrome.exe" y al actualizarse cambiara a  "\Google\Chrome\Application\V00321\Chrome.exe". Que no es el caso. Te lo digo por si alguna vez te encuentras alguna cosa así.

- Segunda opción: Obtener mediante la función Environ el directorio de \program files\ del sistema:
Código
  1. Private Sub Command1_Click()
  2. Print Environ("programfiles")
  3. End Sub
  4.  
y luego añades el resto  "\Google\Chrome\Application\chrome.exe"
Código
  1. Print Environ("programfiles") & "\Google\Chrome\Application\chrome.exe"

- Tercera opción: accediendo al registro de windows





Al final entonces quedaría así

Código
  1. ShellExecute Me.hwnd, "Open", Environ("programfiles") & "\Google\Chrome\Application\chrome.exe", _
  2. "www.elhacker.net", "", 1

Gracias, eres un genio!.


En línea

Miseryk

Desconectado Desconectado

Mensajes: 217


SI.NU.SA U.GU.DE (2NE1 - D-Unit)


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

¿Sin hardcodear? jajaja, ¿Eso está en el diccionario? ¿Qué significa? Es igual, lo supongo :P

"sin hardcodear" otra forma que hay de obtener el /Program files/ del sistema que tenía por ahí guardada y que estaba buscando es esta:

Código
  1. Private Sub Command1_Click()
  2. Dim X As Variant
  3. Dim Y As Variant
  4.   Set X = CreateObject("Wscript.Shell")
  5.    Set Y = X.Environment("Process")
  6.    Print Y("PROGRAMFILES")
  7. End Sub


En cuanto  a lo que has posteado  Miseryk , lo de GetModuleHandle no lo he probado y no se muy bien como va. He probado lo siguiente:
Código
  1. Dim hModule%, Buffer$, Length%, Msg$
  2.         hModule% = GetModuleHandle("notepad.exe")
  3.         Buffer$ = Space$(255)
  4.         Length% = GetModuleFileName(hModule%, Buffer$, Len(Buffer$))
  5.         Buffer$ = Left$(Buffer$, Length%)
  6.         Msg$ = Buffer$
  7.         Msgbox Msg$
:

Pero me da el directorio de VB6.EXE y no el del notepad.exe en este caso, ni siquiera estando en ejecución. He probado sustituyendo hModule% por el hande de la aplicación (en ejecución). Pero nada, que tampoco.

Al usar NULL supongo que tu vas por C++ y no VB, ya que NULL  no es válido en VB6, en sustitución sería vbNull


Bueno, como en internet son todos unos perdedores de *****, me imaginé que el path debía estar adentro de cada EXE, y por lo que pude ver en todos los programas abiertos en W7 32 bits, encontré un addres que contiene el path el cual es: (FUNCIONA CON EL 90% de los programas como OPERA, WINAMP, VB6, la ***** del McAfee, etc), también por lo que pude ver es que si abrís un proyecto de VB6, te toma el path de donde se abrió ese proyecto, muy loco, pero sinó vá a mostrar lo que vos andás buscando.

kernel32.dll+C6320 (UNICODE)

Agregala al cheatengine y andá attachando cada EXE y vás a ver que se carga el path de ese EXE. (Y)

PD: en algunos EXEs del systema no toma el path, pero funcionó con Winlogon y demás.

PD2: si el programa está hecho con una dll en especial, también hay un path con el que funciona el cual es:

msvcrt.dll+A3878 (MULTIBYTE)

PD3: el que quiera ayudar es bienvenido xDDDD la verdad que no me lo puse a ver bien, habría que investigar como funciona el taskmgr y copiar su funcionalidad.

Saludos.
En línea

Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It’s never too late to change our luck
So, don’t let them steal your light
Don’t let them break your stride
There is light on the other side
And you’ll see all the raindrops falling behind
Make it out tonight
it’s a revolution

CL!!!
Miseryk

Desconectado Desconectado

Mensajes: 217


SI.NU.SA U.GU.DE (2NE1 - D-Unit)


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

Por cierto, mi GetModuleFileName no falla, porque se está llamando desde el mismo programa, seguramente GetModuleFileName debe leer la posición de memoria local en relación a ese HMODULE, por éso nunca va a leer otro programa. Cuando llegue a casa veo este tema.
En línea

Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It’s never too late to change our luck
So, don’t let them steal your light
Don’t let them break your stride
There is light on the other side
And you’ll see all the raindrops falling behind
Make it out tonight
it’s a revolution

CL!!!
okik


Desconectado Desconectado

Mensajes: 462


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

Hola,

Esta idea de meter una aplicación dentro de un form, me ha venido genial para un viejo programa de inglés que tengo que requiere ejecutarse a pantalla completa y una resolución de  640x480, tapándome la barra de tareas de windows. El programa se veía en un cuadrito en el centro de la pantalla y el resto en negro, a no ser que redujese la resolución.  Así que gracias.

En cuanto al código que puse he visto fallos. Por ejemplo al cerrar la aplicación también se cerraban todas las ventanas de Chrome, la de dentro del form y las que estaban fuera si era el caso. Se debe a que valor del handle no es público. También ocurre que al utilizar ShowWindow se genera un error de visualización si la última vez que se cerró Chrome estaba en modo Normal. Lo he sustituido por SetWindowPos.

Aquí dejo el código algo mejorado:
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.   ShellExecute Me.hwnd, "", "chrome.exe", _
  57.    "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  58.   Espera (5)  'Espera cinco segundos a que se cargue
  59.   HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  60. Call SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
  61. 'Ajusta la ventana de Chrome al Picture
  62. Call SetWindowPos(HWNDParent, HWND_TOP, 0, 0, _
  63. Picture1.ScaleWidth, _
  64. Picture1.ScaleHeight, _
  65. SWP_NOZORDER)
  66. End Sub
  67. Private Sub Espera(Segundos As Single)
  68. Dim ComienzoSeg As Single
  69. Dim FinSeg As Single
  70. ComienzoSeg = Timer
  71. FinSeg = ComienzoSeg + Segundos
  72. Do While FinSeg > Timer
  73.     DoEvents
  74.     If ComienzoSeg > Timer Then
  75.         FinSeg = FinSeg - 24 * 60 * 60
  76.     End If
  77. Loop
  78. End Sub
  79.  
  80. Private Sub Cerrar_Chrome(hwnd As Long)
  81. If HWNDParent <> 0 Then
  82.    Call SetParent(HWNDParent, 0)  ' Libera el programa
  83.    Call SendMessage(HWNDParent, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) 'Cierra el programa
  84.    HWNDParent = 0
  85. End If
  86.   End Sub
  87. Private Sub Form_Load()
  88.    Picture1.ScaleMode = 3 'pixels <-importante para mover _
  89.     y establecer correctamente las dimensiones de la ventana _
  90.     de chrome dentro del picture
  91. End Sub
  92.  
  93. Private Sub Form_Unload(Cancel As Integer)
  94.   Call Cerrar_Chrome(HWNDParent) 'Cierra Chrome
  95. End Sub
  96.  
  97.  

El handle (hwnd) o 'asa' es un número aleatorio que Windows asigna a cada ventana que se abre en el escritorio. Se pueden cambiar características o enviar mensajes a  dichas ventanas usando ese número. Como se ha podido ver con SetWindowPos, SetParent, SendMessage y ShowWindow.

 
« Última modificación: 7 Febrero 2015, 12:27 pm por okik » En línea

NsTeam

Desconectado Desconectado

Mensajes: 125


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

Nuevamente, muchas gracias!, me anda a la perfección!

Hola,

Esta idea de meter una aplicación dentro de un form, me ha venido genial para un viejo programa de inglés que tengo que requiere ejecutarse a pantalla completa y una resolución de  640x480, tapándome la barra de tareas de windows. El programa se veía en un cuadrito en el centro de la pantalla y el resto en negro, a no ser que redujese la resolución.  Así que gracias.

En cuanto al código que puse he visto fallos. Por ejemplo al cerrar la aplicación también se cerraban todas las ventanas de Chrome, la de dentro del form y las que estaban fuera si era el caso. Se debe a que valor del handle no es público. También ocurre que al utilizar ShowWindow se genera un error de visualización si la última vez que se cerró Chrome estaba en modo Normal. Lo he sustituido por SetWindowPos.

Aquí dejo el código algo mejorado:
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.   ShellExecute Me.hwnd, "", "chrome.exe", _
  57.    "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  58.   Espera (5)  'Espera cinco segundos a que se cargue
  59.   HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  60. Call SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
  61. 'Ajusta la ventana de Chrome al Picture
  62. Call SetWindowPos(HWNDParent, HWND_TOP, 0, 0, _
  63. Picture1.ScaleWidth, _
  64. Picture1.ScaleHeight, _
  65. SWP_NOZORDER)
  66. End Sub
  67. Private Sub Espera(Segundos As Single)
  68. Dim ComienzoSeg As Single
  69. Dim FinSeg As Single
  70. ComienzoSeg = Timer
  71. FinSeg = ComienzoSeg + Segundos
  72. Do While FinSeg > Timer
  73.     DoEvents
  74.     If ComienzoSeg > Timer Then
  75.         FinSeg = FinSeg - 24 * 60 * 60
  76.     End If
  77. Loop
  78. End Sub
  79.  
  80. Private Sub Cerrar_Chrome(hwnd As Long)
  81. If HWNDParent <> 0 Then
  82.    Call SetParent(HWNDParent, 0)  ' Libera el programa
  83.    Call SendMessage(HWNDParent, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) 'Cierra el programa
  84.    HWNDParent = 0
  85. End If
  86.   End Sub
  87. Private Sub Form_Load()
  88.    Picture1.ScaleMode = 3 'pixels <-importante para mover _
  89.     y establecer correctamente las dimensiones de la ventana _
  90.     de chrome dentro del picture
  91. End Sub
  92.  
  93. Private Sub Form_Unload(Cancel As Integer)
  94.   Call Cerrar_Chrome(HWNDParent) 'Cierra Chrome
  95. End Sub
  96.  
  97.  

El handle (hwnd) o 'asa' es un número aleatorio que Windows asigna a cada ventana que se abre en el escritorio. Se pueden cambiar características o enviar mensajes a  dichas ventanas usando ese número. Como se ha podido ver con SetWindowPos, SetParent, SendMessage y ShowWindow.

 

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

NsTeam

Desconectado Desconectado

Mensajes: 125


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

@okik, quería consultarte algo.

Por qué es que en mi PC funciona normal cuando genero el .exe, pero cuando intento abrir el ejecutable en otra PC, sólo se abre Chrome mas no lo incrusta en el picture del form.

Supuse que quizá el problema esté en esta parte

Código
  1. HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  2. Call SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture

Quizá el problema esté en no poder obtener el handle padre o no poder meter la aplicación al picture.

Reitero que en mi PC funciona perfecto, pero cuando pruebo el .exe generado en otra PC no logra incrustar Chrome al picture.

Cómo podría solucionarlo?...

Gracias.
« Última modificación: 8 Febrero 2015, 16:51 pm por NsTeam » En línea

okik


Desconectado Desconectado

Mensajes: 462


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

@okik, quería consultarte algo.

Por qué es que en mi PC funciona normal cuando genero el .exe, pero cuando intento abrir el ejecutable en otra PC, sólo se abre Chrome mas no lo incrusta en el picture del form.

Supuse que quizá el problema esté en esta parte

Código
  1. HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  2. Call SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture

Quizá el problema esté en no poder obtener el handle padre o no poder meter la aplicación al picture.

Reitero que en mi PC funciona perfecto, pero cuando pruebo el .exe generado en otra PC no logra incrustar Chrome al picture.

Cómo podría solucionarlo?...

Gracias.

Hola @NsTeam,
Lo he probado en un portátil LG con Vista y en un PC con XP y funciona en los dos. Sinceramente no se que puede ser. Si no lo mete se me ocurren dos casos. Uno es, que como tu dices pudiera ser que no encuentra el Handle (hwnd) de Chrome. Es decir el número que hace a referéncia a la ventana abierta de Chrome. Si ocurre esto, puede ser porque el nombre de clase (Chrome_WidgetWin_1) sea distinto por ser una versión más antigua o algo así, o bien porque dicho PC es lento y al Chrome no le da tiempo a abrirse antes de que que tu programa trate de obtener el handle de la ventana de Chrome. Piensa que no se puede obtener el handle hasta que no se haya cargado el programa por completo.
Para solucionar estos posibles problemas haremos lo siguiente:
- Determinar el nombre de clase de Chrome.
VB6 y posteriores versiones disponen de una herramienta externa llamada Spy++. Si lo has instalado, vas al menú "Programas/Microsoft Visual Studio 6.0/Herramientas de Microsoft Visual Studio 6.0/" y aquí encontrarás el acceso directo. El nombre del EXE es SPYXX.EXE.

Ahora abre una ventana de Chrome, no hace falta que sea desde tu programa. Ejecuta el Spy++  y una vez abierto pulsa CTRL+F. Se abrirá un formulario y dentro hay un icono con una diana. La diana es arrastrable. Pulsa en ella y arrastrala hasta una ventana abierta de Chrome. Spy++ te irá mostrando los nombre de clase  a medida que vayas arrastrando la diana por la ventana de Chrome y se mostrará un cuadro en negrita hayá por donde arrastres que indica el objeto seleccionado. Tiene varios nombres de clase, el que te interesa el que hace referéncia a la ventana más externa de Chrome. Es posible hacer tu propio Spy++ de forma sencilla mediante GetCursorPos , WindowFromPointXY  y GetClassName. Más adelante en este post pondré el código.

- Esperar a que Chrome se cargue antes de obtener el Handle
Como parece ser que lo de Espara(5) (esperar 5 segundos) es ineficiente. Vamos a hacer que el programa no trate de obtener el handle hasta que Chrome no se haya abierto del todo. Para ello hacemos un bucle con Do/Loop que se repetirá indefinidamente hasta que el handle tenga un valor distinto de 0:

Sustituye el código en el lugar que nos ocupa por el siguiente:
Código
  1. HWNDParent = 0
  2.   ShellExecute Me.hwnd, "", "chrome.exe", _
  3.    "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  4.   Espera (1)  'Espera  un segundo antes de intantar obtener el handle
  5.   Do While HWNDParent = 0
  6.   HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  7.   DoEvents
  8.   Loop

Como ves sigo poniendo el Espera(1), porque si no lo hago, obtiene el handle y carga el chrome pero lo hace tan rápido que no le da tiempo a graficarse y solo muestra un pestaña de color negro.

Luego el código queda así:
Código
  1. Private Sub Command1_Click()
  2. HWNDParent = 0
  3.   ShellExecute Me.hwnd, "", "chrome.exe", _
  4.    "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  5.   Espera (1)  'Espera  un segundo antes de intantar obtener el handle
  6.   Do While HWNDParent = 0
  7.   HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  8.   DoEvents
  9.   Loop
  10.  
  11. Call SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
  12. 'Ajusta la ventana de Chrome al Picture
  13. Call SetWindowPos(HWNDParent, HWND_TOP, 0, 0, _
  14. Picture1.ScaleWidth, _
  15. Picture1.ScaleHeight, _
  16. SWP_NOZORDER)
  17. End Sub


Espero que esto sirva para solucionar el problema.   ;D


Lo prometido es deuda, así que aquí te dejo  un código que te permitira obtener los nombres de clase  y otros datos de cualquier ventana que haya abierta en tu escritorio de Windows con tan sólo pasar el puntero del ratón.

- Crea en un form un cuadro de texto TextBox
- Cambia la propiedad del TextBox a Multiline=true (es de solo lectura así que se debe hacer desde la ventana de propiedades)
- Crea un control Timer
Código
  1. Private Type POINTAPI
  2. x As Long
  3. y As Long
  4. End Type
  5.  
  6. Private Declare Function GetCursorPos Lib "user32" _
  7. (lpPoint As POINTAPI) As Long
  8. Private Declare Function WindowFromPointXY Lib "user32" Alias "WindowFromPoint" _
  9. (ByVal xPoint As Long, ByVal yPoint As Long) As Long
  10. Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" _
  11. (ByVal hModule As Long, _
  12. ByVal lpFileName As String, _
  13. ByVal nSize As Long) As Long
  14. Private Declare Function GetWindowWord Lib "user32" _
  15. (ByVal hwnd As Long, ByVal nIndex As Long) As Integer
  16. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
  17. (ByVal hwnd As Long, _
  18. ByVal nIndex As Long) As Long
  19. Private Declare Function GetParent Lib "user32" _
  20. (ByVal hwnd As Long) As Long
  21. Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
  22. (ByVal hwnd As Long, _
  23. ByVal lpClassName As String, _
  24. ByVal nMaxCount As Long) As Long
  25. Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
  26. (ByVal hwnd As Long, _
  27. ByVal lpString As String, _
  28. ByVal cch As Long) As Long
  29.  
  30. Const GWW_HINSTANCE = (-6)
  31. Const GWW_ID = (-12)
  32. Const GWL_STYLE = (-16)
  33. Dim DATOS As String
  34.  
  35. Private Sub Form_Load()
  36. Text1.Text = ""
  37. Timer1.Interval = 1
  38. Timer1.Enabled = True
  39. End Sub
  40.  
  41. Sub Timer1_Timer()
  42. Dim pt32 As POINTAPI
  43. Dim ptx As Long
  44. Dim pty As Long
  45. Dim sWindowText As String * 100
  46. Dim sClassName As String * 100
  47. Dim hWndOver As Long
  48. Dim hWndParent As Long
  49. Dim sParentClassName As String * 100
  50. Dim wID As Long
  51. Dim lWindowStyle As Long
  52. Dim hInstance As Long
  53. Dim sParentWindowText As String * 100
  54. Dim sModuleFileName As String * 100
  55. Static hWndLast As Long
  56.  
  57. Call GetCursorPos(pt32)                ' obtiene la posición del cursor
  58. ptx = pt32.x
  59. pty = pt32.y
  60. hWndOver = WindowFromPointXY(ptx, pty) ' Obtiene el handle debajo del cursor
  61. If hWndOver <> hWndLast Then
  62. hWndLast = hWndOver
  63. DATOS = ""
  64.  
  65. ' Muestra el handle de la ventana
  66. DATOS = DATOS & "Window Handle: &H" & Hex(hWndOver) & vbCrLf
  67. r = GetWindowText(hWndOver, sWindowText, 100)      ' Window text
  68. DATOS = DATOS & "Window Text: " & Left(sWindowText, r) & vbCrLf
  69. r = GetClassName(hWndOver, sClassName, 100)         ' Window Class
  70. DATOS = DATOS & "Window Class Name: " & Left(sClassName, r) & vbCrLf
  71. lWindowStyle = GetWindowLong(hWndOver, GWL_STYLE)   ' Window Style
  72. DATOS = DATOS & "Window Style: &H" & Hex(lWindowStyle) & vbCrLf
  73.  
  74. hWndParent = GetParent(hWndOver) ' Consigue el handle padre de una ventana
  75.  
  76. 'Obtiene más información si hay un handle padre
  77. If hWndParent <> 0 Then
  78. wID = GetWindowWord(hWndOver, GWW_ID) ' Obiene el ID
  79. DATOS = DATOS & "Window ID Number: &H" & Hex(wID) & vbCrLf
  80. DATOS = DATOS & "Parent Window Handle: &H" & Hex(hWndParent) & vbCrLf
  81.  
  82. 'Obiene el texto de la ventana
  83. r = GetWindowText(hWndParent, sParentWindowText, 100)
  84. DATOS = DATOS & "Parent Window Text: " & Left(sParentWindowText, r) & vbCrLf
  85.  
  86. 'Consigue el ClassName de la ventana padre
  87. r = GetClassName(hWndParent, sParentClassName, 100)
  88. DATOS = DATOS & "Parent Window Class Name: " & Left(sParentClassName, r) & vbCrLf
  89. Else
  90.  
  91. 'Obtiene los campos cuando no es padre:
  92. DATOS = DATOS & "Window ID Number: N/A" & vbCrLf
  93. DATOS = DATOS & "Parent Window Handle: N/A" & vbCrLf
  94. DATOS = DATOS & "Parent Window Text : N/A" & vbCrLf
  95. DATOS = DATOS & "Parent Window Class Name: N/A" & vbCrLf
  96. End If
  97. ' Consigue el  window instance:
  98. hInstance = GetWindowWord(hWndOver, GWW_HINSTANCE)
  99.  
  100. 'Consigue el modulo de nombre de archivo (obsoleto)
  101. r = GetModuleFileName(hInstance, sModuleFileName, 100)
  102. DATOS = DATOS & "Module: " & Left(sModuleFileName, r)
  103. End If
  104. Text1.Text = DATOS
  105. End Sub
  106.  

Saludos


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

NsTeam

Desconectado Desconectado

Mensajes: 125


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

Lo he probado, pero aún así no logro abrir el ejecutable en mi laptop, lo probé en otra PC, y en la PC sí lo abre.

Lo curioso es que en mi laptop el 50% abre chrome y lo incrusta al picture, y el otro 50% sólo abre chrome pero no lo incrusta y efectivamente también el nombre de la clase es "Chrome_WidgetWin_1", lo cual no creo que sea el error

De todas maneras gracias.

« Última modificación: 9 Febrero 2015, 21:37 pm por NsTeam » En línea

okik


Desconectado Desconectado

Mensajes: 462


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

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

« Última modificación: 10 Febrero 2015, 19:21 pm 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 8,204 Último mensaje 10 Noviembre 2008, 22:16 pm
por BETA_V
Abrir un form desde otro form con netbeans en java
Java
murdock_ 3 45,365 Último mensaje 1 Enero 2009, 03:44 am
por sapito169
Efecto al abrir el Form
Programación Visual Basic
Nardo[N] 5 6,190 Último mensaje 10 Febrero 2011, 01:51 am
por Nardo[N]
Abrir ejecutable al abrir una carpeta
Windows
Kurolox 2 2,354 Último mensaje 15 Julio 2014, 20:54 pm
por Eleкtro
Abrir Chrome dentro de un form
Programación Visual Basic
NsTeam 4 5,987 Último mensaje 3 Febrero 2015, 13:49 pm
por okik
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines