Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - NsTeam

#11
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é

[youtube=640,360]https://www.youtube.com/watch?v=zXTfUBzm6yQ[/youtube]

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.


Cita de: okik en 11 Febrero 2015, 16:43 PM
#12
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.

[youtube=640,360]https://www.youtube.com/watch?v=i1MEd0T7JzA[/youtube]

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í.

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

Cita de: okik 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 (vb) [Seleccionar]
Do While N& = 0
N& = SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
DoEvents
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 (vb) [Seleccionar]
Private Sub Form_Unload(Cancel As Integer)
  Call Cerrar_Chrome(HWNDParent) 'Cierra Chrome
  End
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


#13
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.

Cita de: okik en  9 Febrero 2015, 17:50 PM
#14
@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 (vb) [Seleccionar]
HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
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.
#15
Nuevamente, muchas gracias!, me anda a la perfección!

Cita de: okik 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 (vb) [Seleccionar]
'Nombres de clase (ClassName) de Chrome
'Chrome_WidgetWin_1           <---Padre
'Chrome_RenderWidgetHostHWND  <---hijo

'//Funciones API para incrustar la aplicación en el picture
Private Declare Function SetParent Lib "user32" _
(ByVal hWndChild As Long, _
ByVal HWNDParent As Long) As Long
Private Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
Private Declare Function 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) As Long

'//Funcion API para obtener el handle de la aplicación que se quiere menter en el Picture
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

'//Ejecuta el programa
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

'//Función para cerrar la aplicación incrustada
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long

Const SHOW_FULLSCREEN = 3
Const SW_SHOWMINIMIZED = 2
Const SW_SHOWMAXIMIZED = 3
Const SWP_NOZORDER = &H4
Const WM_SYSCOMMAND = &H112
Const SC_CLOSE = &HF060&

'//////////////////////////////////////////////
'//'Variable para el handle padre de Chrome  //
'//Debe ser variable pública para que al     //
'//cerrar el form únicamente se cierre el    //
'//chrome incrustado en el picture y no      //
'//otra ventana externa de chrome         /////
       Dim HWNDParent As Long
'//////////////////////////////////////////////

Private Sub Command1_Click()
  ShellExecute Me.hwnd, "", "chrome.exe", _
   "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  Espera (5)  'Espera cinco segundos a que se cargue
  HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
Call SetParent(HWNDParent, Picture1.hwnd) 'Meter la apcliación en el picture
'Ajusta la ventana de Chrome al Picture
Call SetWindowPos(HWNDParent, HWND_TOP, 0, 0, _
Picture1.ScaleWidth, _
Picture1.ScaleHeight, _
SWP_NOZORDER)
End Sub
Private Sub Espera(Segundos As Single)
Dim ComienzoSeg As Single
Dim FinSeg As Single
ComienzoSeg = Timer
FinSeg = ComienzoSeg + Segundos
Do While FinSeg > Timer
    DoEvents
    If ComienzoSeg > Timer Then
        FinSeg = FinSeg - 24 * 60 * 60
    End If
Loop
End Sub

Private Sub Cerrar_Chrome(hwnd As Long)
If HWNDParent <> 0 Then
   Call SetParent(HWNDParent, 0)  ' Libera el programa
   Call SendMessage(HWNDParent, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) 'Cierra el programa
   HWNDParent = 0
End If
  End Sub
Private Sub Form_Load()
   Picture1.ScaleMode = 3 'pixels <-importante para mover _
   y establecer correctamente las dimensiones de la ventana _
   de chrome dentro del picture
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Call Cerrar_Chrome(HWNDParent) 'Cierra Chrome
End Sub



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.



#16
Cita de: okik en  4 Febrero 2015, 13:53 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 (vb) [Seleccionar]
Private Sub Form_Unload(Cancel As Integer)
   Dim hwnd As Long
   Dim hWndChild As Long  '<---- BORRAR ESTA LÍNEA
   'Espera (5) '<---- BORRAR ESTA LÍNEA
   hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)
   Call Cerrar_Google(hwnd) 'cierra Google
End Sub


Debería ser así:

Código (vb) [Seleccionar]
Private Sub Form_Unload(Cancel As Integer)
   Dim hwnd As Long
   hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)
   Call Cerrar_Google(hwnd) 'cierra Google
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 (vb) [Seleccionar]
Private Sub Command1_Click()
Print Environ("programfiles")
End Sub

y luego añades el resto  "\Google\Chrome\Application\chrome.exe"
Código (vb) [Seleccionar]
Print Environ("programfiles") & "\Google\Chrome\Application\chrome.exe"

- Tercera opción: accediendo al registro de windows





Al final entonces quedaría así

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


Gracias, eres un genio!.
#17
Hola @okik , probé tu código y funciona perfecto. Tengo una duda, ¿Es posible detectar automáticamente la Ruta de Chrome, sin necesidad de que el usuario busque la ruta, en mi caso es "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"?, me preguntaba si hay alguna forma de detectar la ruta de chrome.exe automáticamente.

Muchas gracias nuevamente.
#18
Alguien podría ayudarme, por favor. Aún no puedo dar con la solución :(
#19
Cita de: engel lex en  1 Febrero 2015, 00:04 AM
no será porque chrome crea un proceso base y abre un proceso hijo por ventana? tendrías que capturar todos los childs de chrome... si te fijas en el administrador de taréas el siempre abre unas 2 o 3 instancias y luego una por ventana más otras por los flash y "accesorios"

Hola compañero, gracias por tu respuesta...

Es lógico lo que me dices y tienes razón cuando lo vi en el administrador de tareas, pero creer que haya alguna forma de hacerlo modificando el código que tengo, es posible?
#20
Tengo el siguiente código que es para abrir un ejecutable en un exe.

Código (VB) [Seleccionar]
Option Explicit

Private Declare Function GetGUIThreadInfo Lib "user32.dll" ( _
                ByVal idThread As Long, _
                ByRef pgui As GUITHREADINFO) As Long
               
Private Declare Function SetParent Lib "user32" _
               (ByVal hWndChild As Long, _
                ByVal hWndNewParent As Long) As Long

Private Declare Function GetAncestor Lib "user32.dll" _
               (ByVal hwnd As Long, _
                ByVal gaFlags As Long) As Long
               
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
               (ByVal lpApplicationName As String, _
                ByVal lpCommandLine As String, _
                lpProcessAttributes As SECURITY_ATTRIBUTES, _
                lpThreadAttributes As SECURITY_ATTRIBUTES, _
                ByVal bInheritHandles As Boolean, _
                ByVal dwCreationFlags As Long, _
                lpEnvironment As Any, ByVal _
                lpCurrentDriectory As String, _
                lpStartupInfo As STARTUPINFO, _
                lpProcessInformation As PROCESS_INFORMATION) As Long
               
Private Declare Function 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) As Long

Private Type RECT
       Left As Long
       Top As Long
       Right As Long
       Bottom As Long
End Type

Private Type GUITHREADINFO
       cbSize As Long
       flags As Long
       hwndactive As Long
       hwndFocus As Long
       hwndCapture As Long
       hwndMenuOwner As Long
       hwndMoveSize As Long
       hwndcaret As Long
       rcCaret As RECT
End Type
Private Type STARTUPINFO
       cb As Long
       lpReserved As String
       lpDesktop As String
       lpTitle As String
       dwX As Long
       dwY As Long
       dwXSize As Long
       dwYSize As Long
       dwXCountChars As Long
       dwYCountChars As Long
       dwFillAttribute As Long
       dwFlags As Long
       wShowWindow As Integer
       cbReserved2 As Integer
       lpReserved2 As Long
       hStdInput As Long
       hStdOutput As Long
       hStdError As Long
End Type

Private Type PROCESS_INFORMATION
       hProcess As Long
       hThread As Long
       dwProcessId As Long
       dwThreadId As Long
End Type

Private Type SECURITY_ATTRIBUTES
       nLength As Long
       lpSecurityDescriptor As Long
       bInheritHandle As Boolean
End Type

Private Const GA_PARENT = 1
Private Const SWP_NOOWNERZORDER = &H200
Private Const SWP_NOZORDER = &H4
Private Const SWP_SHOWWINDOW = &H40

Private udtGUI As GUITHREADINFO
Private udtProc As PROCESS_INFORMATION

Private Function StartProcess(strProgram As String) As Long
Dim udtStartup As STARTUPINFO
Dim udtSec As SECURITY_ATTRIBUTES
Dim lngReturn As Long
udtStartup.cb = Len(udtStartup)
udtSec.nLength = Len(udtSec)
udtSec.bInheritHandle = True
'
' Start the process
'
lngReturn = CreateProcess(strProgram, vbNullString, udtSec, udtSec, _
                        True, ByVal 0, ByVal 0, vbNullString, _
                        udtStartup, _
                        udtProc)
txtProcess.Text = Hex(udtProc.dwThreadId)
lngReturn = GetAncestor(udtProc.hProcess, GA_PARENT)
txtParent.Text = Hex(lngReturn)
udtGUI.cbSize = Len(udtGUI)
'
' Wait for an hWnd to be allocated
'
Do
   lngReturn = GetGUIThreadInfo(udtProc.dwThreadId, udtGUI)
   DoEvents
Loop Until udtGUI.hwndactive <> 0
StartProcess = udtGUI.hwndactive
End Function
Private Sub PositionWindow(hwnd As Long)
Dim lngReturn As Long
lngReturn = SetWindowPos(hwnd, hwnd, 250&, 0&, 250&, 250&, SWP_NOZORDER Or SWP_SHOWWINDOW)
End Sub
Private Sub cmdIE_Click()
Dim lngReturn As Long
Dim strProg As String
strProg = "C:\Program Files (x86)\FileZilla FTP Client\filezilla.exe"
lngReturn = StartProcess(strProg)
End Sub


Private Sub Command1_Click()
'
' Change the Parent
'
Dim lngReturn As Long
Dim lngStyle As Long
lngReturn = SetParent(udtGUI.hwndactive, Me.hwnd)
Call PositionWindow(udtGUI.hwndactive)
lngReturn = GetAncestor(udtGUI.hwndactive, GA_PARENT)
txtParent.Text = Hex(lngReturn)
End Sub

Private Sub Form_Load()
txtMe.Text = Hex(Me.hwnd)
'
' Scalemode = Pixel
'
Me.ScaleMode = 3
End Sub



Y efectivamente hace lo que yo quiero, abre un programa dentro del formulario, lo probé con la calculadora de Windows e incluso con otros programas



Pero lo que no entiendo es por qué no pasa lo mismo con Chrome, me refiero a que lo abre en una nueva ventana mas no dentro del formulario.

Me urge terminarlo cuanto antes, espero puedan ayudarme, muchas gracias!