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 - okik

#771
Gracias,

El tengo el MSDN de VB6 (pero en inglés) el de VB.NET 2005( también en inglés) y el de VB.NET 2010 (en castellano), pero cuando busco por ejemplo como usar el control MonthTimer siempre me salen referéncias a Clases, es decir crear objetos Timer, y en muchos casos las propiedades de objetos no están disponibles en el control mismo. Esto es lo que realmente me molesta. Además, en ocasiones me sale en inglés, según el caso. Otra cosa me fastidia es no encontrar ejemplos por ejemplo de como usar una determinada función API, tan sólo obtengo descripciones.
#772
Cita de: NsTeam 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 (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.

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 (vb) [Seleccionar]
HWNDParent = 0
  ShellExecute Me.hwnd, "", "chrome.exe", _
   "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  Espera (1)  'Espera  un segundo antes de intantar obtener el handle
  Do While HWNDParent = 0
  HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  DoEvents
  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 (vb) [Seleccionar]
Private Sub Command1_Click()
HWNDParent = 0
  ShellExecute Me.hwnd, "", "chrome.exe", _
   "www.elhacker.net", Environ("programfiles") & "\Google\Chrome\Application\", SW_SHOWMINIMIZED
  Espera (1)  'Espera  un segundo antes de intantar obtener el handle
  Do While HWNDParent = 0
  HWNDParent = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
  DoEvents
  Loop
   
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



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 (vb) [Seleccionar]
Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPointXY Lib "user32" Alias "WindowFromPoint" _
(ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" _
(ByVal hModule As Long, _
ByVal lpFileName As String, _
ByVal nSize As Long) As Long
Private Declare Function GetWindowWord Lib "user32" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Integer
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function GetParent Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long

Const GWW_HINSTANCE = (-6)
Const GWW_ID = (-12)
Const GWL_STYLE = (-16)
Dim DATOS As String

Private Sub Form_Load()
Text1.Text = ""
Timer1.Interval = 1
Timer1.Enabled = True
End Sub

Sub Timer1_Timer()
Dim pt32 As POINTAPI
Dim ptx As Long
Dim pty As Long
Dim sWindowText As String * 100
Dim sClassName As String * 100
Dim hWndOver As Long
Dim hWndParent As Long
Dim sParentClassName As String * 100
Dim wID As Long
Dim lWindowStyle As Long
Dim hInstance As Long
Dim sParentWindowText As String * 100
Dim sModuleFileName As String * 100
Static hWndLast As Long

Call GetCursorPos(pt32)                ' obtiene la posición del cursor
ptx = pt32.x
pty = pt32.y
hWndOver = WindowFromPointXY(ptx, pty) ' Obtiene el handle debajo del cursor
If hWndOver <> hWndLast Then
hWndLast = hWndOver
DATOS = ""

' Muestra el handle de la ventana
DATOS = DATOS & "Window Handle: &H" & Hex(hWndOver) & vbCrLf
r = GetWindowText(hWndOver, sWindowText, 100)      ' Window text
DATOS = DATOS & "Window Text: " & Left(sWindowText, r) & vbCrLf
r = GetClassName(hWndOver, sClassName, 100)         ' Window Class
DATOS = DATOS & "Window Class Name: " & Left(sClassName, r) & vbCrLf
lWindowStyle = GetWindowLong(hWndOver, GWL_STYLE)   ' Window Style
DATOS = DATOS & "Window Style: &H" & Hex(lWindowStyle) & vbCrLf

hWndParent = GetParent(hWndOver) ' Consigue el handle padre de una ventana
       
'Obtiene más información si hay un handle padre
If hWndParent <> 0 Then
wID = GetWindowWord(hWndOver, GWW_ID) ' Obiene el ID
DATOS = DATOS & "Window ID Number: &H" & Hex(wID) & vbCrLf
DATOS = DATOS & "Parent Window Handle: &H" & Hex(hWndParent) & vbCrLf

'Obiene el texto de la ventana
r = GetWindowText(hWndParent, sParentWindowText, 100)
DATOS = DATOS & "Parent Window Text: " & Left(sParentWindowText, r) & vbCrLf

'Consigue el ClassName de la ventana padre
r = GetClassName(hWndParent, sParentClassName, 100)
DATOS = DATOS & "Parent Window Class Name: " & Left(sParentClassName, r) & vbCrLf
Else

'Obtiene los campos cuando no es padre:
DATOS = DATOS & "Window ID Number: N/A" & vbCrLf
DATOS = DATOS & "Parent Window Handle: N/A" & vbCrLf
DATOS = DATOS & "Parent Window Text : N/A" & vbCrLf
DATOS = DATOS & "Parent Window Class Name: N/A" & vbCrLf
End If
' Consigue el  window instance:
hInstance = GetWindowWord(hWndOver, GWW_HINSTANCE)

'Consigue el modulo de nombre de archivo (obsoleto)
r = GetModuleFileName(hInstance, sModuleFileName, 100)
DATOS = DATOS & "Module: " & Left(sModuleFileName, r)
End If
Text1.Text = DATOS
End Sub


Saludos


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


#774
Hola,
Ya uso Vb,net pero estoy corrigiendo un programa que hice con vb6. Es un poco grande y no quiero pasarlo a vb.net.

El programa descarga archivos pero ocurre que NO descarga archivos que sean demasiado grandes.

El código que uso para descargar es este:

Código (vb) [Seleccionar]
Private Declare Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" (ByVal pCaller As Long,  _
ByVal szURL As String,  _
ByVal szFileName As String,  _
ByVal dwReserved As Long,  _
ByVal lpfnCB As Long) As Long
Dim Contador As Integer
   Const ERROR_SUCCESS As Long = 0
   Const INTERNET_FLAG_RELOAD As Long = &H80000000
   Const BINDF_ASYNCHRONOUS = &H1
   Const BINDF_ASYNCSTORAGE = &H2
   Const BINDF_NOPROGRESSIVERENDERING = &H4
   Const BINDF_OFFLINEOPERATION = &H8
   Const BINDF_GETNEWESTVERSION = &H10 ' El funcionamiento del lazo debe recuperar la más nueva versión de los datos.
   Const BINDF_NOWRITECACHE = &H20
   Const BINDF_NEEDFILE = &H40
   Const BINDF_PULLDATA = &H80
   Const BINDF_IGNORESECURITYPROBLEM = &H100
   Const BINDF_RESYNCHRONIZE = &H200
   Const BINDF_HYPERLINK = &H400
   Const BINDF_NO_UI = &H800
   Const BINDF_SILENTOPERATION = &H1000
   Const BINDF_PRAGMA_NO_CACHE = &H2000
   Const BINDF_FREE_THREADED = &H10000
   Const BINDF_DIRECT_READ = &H20000
   Const BINDF_FORMS_SUBMIT = &H40000
   Const BINDF_GETFROMCACHE_IF_NET_FAIL = &H80000



Public Function DownloadFile(URL As String,  _
LocalFilename As String) As Boolean
   Dim lngRetVal As Long
   lngRetVal = URLDownloadToFile(0&, URL, LocalFilename, BINDF_ASYNCHRONOUS , 0&)
   If lngRetVal = 0 Then DownloadFile = True
End Function
#775
Cita de: Miseryk en  4 Febrero 2015, 14:22 PM
Sin hardcodear:

Código (cpp) [Seleccionar]

GetModuleFileName(NULL, EXEFullPath, MAX_PATH);


El NULL es el baseaddress, yo lo llamo desde un hook (DLL) y cuando pasa por una función mia, estoy seguro que es del thread del mismo exe y no de mi thread de la DLL.

PD: éso si está en ejecución, de lo contrario es fijarse en el Registro en donde está la lista de todos los programas instalados.

¿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 (vb) [Seleccionar]
Private Sub Command1_Click()
Dim X As Variant
Dim Y As Variant
  Set X = CreateObject("Wscript.Shell")
   Set Y = X.Environment("Process")
   Print Y("PROGRAMFILES")
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 (vbnet) [Seleccionar]
Dim hModule%, Buffer$, Length%, Msg$
        hModule% = GetModuleHandle("notepad.exe")
        Buffer$ = Space$(255)
        Length% = GetModuleFileName(hModule%, Buffer$, Len(Buffer$))
        Buffer$ = Left$(Buffer$, Length%)
        Msg$ = Buffer$
        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
#776
Cita de: NsTeam en  3 Febrero 2015, 21:54 PM
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.

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



#777
Hola

Me resultó interesante tu idea. Así que he estado trabajando un poquillo en el tema. A mi me funciona:
- Crea un Picture (que sea un poco grande)
- Crea un CommandButton
-Intruduce el siguiente código en un form
Código (vb) [Seleccionar]
  '//Funciones API para incrustar el programa 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
   Const SHOWMAXIMIZED_eSW = 3&
   
   '//Funciones API para obtener el handle de la aplicación que queremos meter en un 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
 
   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 WM_SYSCOMMAND = &H112
   Const SC_CLOSE = &HF060&

'ClassName Chrome
'Chrome_RenderWidgetHostHWND  <---hijo
'Chrome_WidgetWin_1  <----Padre
Private Sub Command1_Click()
   Dim hwnd As Long
   ' "C:\Program Files\Google\Chrome\Application\chrome.exe", vbHide 'No sirve
   ShellExecute Me.hwnd, "Open", "C:\Program Files\Google\Chrome\Application\chrome.exe",  _
"www.elhacker.net", "", 1
   Espera (5) 'Espera cinco segundos a que se cargue
   hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString) 'Obtiene el handle padre
Call SetParent(hwnd, Picture1.hwnd) 'Meter la apcliación en el picture
Call ShowWindow(hwnd, SHOWMAXIMIZED_eSW) 'Lo ajusta al cuadro
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_Google(hwnd As Long)
   If hwnd <> 0 Then
   Call SetParent(hwnd, 0)  ' Libera el programa
   Call SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) 'Cierra el programa
   hwnd = 0
   End If
   End Sub


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


NOTA IMPORTANTE:
Tan sólo hay un problemilla. Cuando le des al botón, Chrome se iniciará pero fuera de form, pasado un par de segundos se introduce en el form. Lo suyo sería iniciarlo en modo hide (oculto) y luego volverlo a hacer visible.  Estoy mirando a ver, el shell "programa", vbhide, no funciona.

La ventaja que tiene usar ShellExecute es que puedes elegir la URL que quieres que muestre

Si usas 64Bits, la dirección del programa debes cambiarla a "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" y bueno ya tu ya sabes, el directorio debe ser el que tu tengas en tu compu o sea

Saludos
#779
Hola,
windows XP te muestra un perrito que quiero llevar a la perrera...vamos quitarlo de ahí.






En realidad es mera curiosidad de como hacerlo, porque una vez me descargué un XP de windowsue, que había sido modificado, incluso el programa de instalación. Venía con algunos reagalitos (virus, troyanos), y había quitado el perrito. Siempre me he preguntado como lo hizo. Supongo que el sistema de búsqueda usa algunos dlls, y que habrá que sustiturilos o modificarlos.

Gracias




Me respondo yo mismo... lo encontre aquí:

http://www.fermu.com/es/start/16-regedit/configuracion-del-sistema/87-quitar-el-perrito-de-la-busqueda-de-xp

Hay que entrar en el registro de windows:
-Tecla windows + R
- escribir: regedit
-ir a:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState]
- Crear una nueva clave alfanumérica y nombrarla: use search asst
- Modificar la clave y poner: no
- no hace falta reiniciar
#780


La informacion de revocacion del certificado de seguridad de este sitio no está disponible. ¿Desea continuar?


He econtrado este código:

Código (vbnet) [Seleccionar]
Public Shared Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function
    Private Sub WebBrowser1_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles WebBrowser1.Validated
        System.Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf ValidateServerCertificate
    End Sub


Me funcionó  creo que un par de veces pero ahora no se porqué no funciona, sigue vuelve a salir la alerta de seguridad.

y si pongo:
Código (vbnet) [Seleccionar]
WebBrowser1.ScriptErrorsSuppressed = True

simplemente no entra y ni sale mensaje ni nada