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

#721
Hola
Lo que hay que hacer es primero cargar el texto en  una variable, tal cual  y luego mediante Split, se lee linea por linea. En lugar de leer linea por lína a medida que se leen los datos. Se meten tal cual en la variabla y luego ya se puede leer con Split sin problemas.


Código (vb) [Seleccionar]
Sub AbrirLista(List As ListBox, FileName As String)
Dim LineaTexto As String
Dim File As Integer
Dim Cont As Integer
Dim cDato As String
File = FreeFile

 'Abre el archivo
   Open FileName For Binary Access Read Write Lock Write As #File
   cDato = String(1, " ")
       While Not EOF(File)
           Get #File, , cDato
          LineaTexto = LineaTexto & cDato 'Carga el texto en una variable
       Wend
       Close #1
 'Lee linea por linea y las mete en el ListBox
Dim Lineas() As String
Dim i As Integer
Lineas = Split(LineaTexto, vbNewLine)
For i = LBound(Lineas) To UBound(Lineas)
If Lineas(i) > "" Then
   List1.AddItem Lineas(i)
End If
Next
End Sub
#722
hola

Con VB6 usando SetWindowsHookEx no hay problema, funciona a la perfección. Pero en VB.Net no funciona. Cuando se llama a SetWindowsHookEx se obtiene un ID, que es un número largo. Ese numero cambia cada vez que se llama a SetWindowsHookEx de modo que una vez bloqueado para desbloquear el teclado, es necesario usar el mismo ID con que se bloqueó con UnhookWindowsHookEx.

https://www.daniweb.com/software-development/vbnet/threads/427872/disable-windows-key-on-keyboard-when-application-is-running


El caso es que encontré la forma de obtener el Id con SetWindowsHookEx en VB.Net, sin embargo NO BLOQUEA EL TECLADO, pero con VB6 sí. No se porqué.

Para VB.Net se necesita el triple de código, y como se puede ver en VB6 el código es muy reducido.

Código (vb) [Seleccionar]
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Const WH_KEYBOARD = 2
Private X() As Long
Dim Dm As Long

Private Sub Command1_Click()
'Bloquear teclado
ReDim X(Dm)
X(Dm) = SetWindowsHookEx(WH_KEYBOARD, AddressOf WinProcKeyBoard, App.hInstance, App.ThreadID)
Dm = Dm + 1
'Nota: La tecla windows y Ctrl+Alt+Supr seguirán activos
End Sub
Private Sub Command2_Click()
'Desbloquear teclado
UnhookWindowsHookEx X(0)
End Sub

Private Sub Form_Load()
Command1.Caption = "Bloquear teclado"
Command2.Caption = "Desbloquear teclado"
End Sub

'===========================================
'///////////////////////////////////////////
'A TENER EN CUENTA ANTES DE USAR
'Al pulsar Command1 SetWindowsHookEx se
'obtiene un ID que es introducido en X.
'Este hilo es un número tal como 1442617; 2229059;...; etc
'El primer valor X, supongamos por ejemplo 1442617,
'es el ÚNICO VALOR QUE PUEDE DESBLOQUEAR EL TECLADO
'mediante UnhookWindowsHookEx (al pulsar en Command2)
'de modo que si se sigue pulsando command1, X irá adquiriendo
'nuevos valores que YA NO SERVIRÁN PARA DESBLOQUEAR,
'X perderá su valor original (1442617 en este caso ejemplo)
'y habrá que cerrar sesión o reiniciar windows para
'volver a disponer del teclado.

'Para evitar eso, he creado un array en X
'De modo que el primer valor queda fijado en X(0)
'Los siguientes valores (si se sigue pulsando Command1)
'se irán introduciendo en X(1),X(2),..,X(n)
'///////////////////////////////////////////
'===========================================



#723
Gracias por tu ayuda @Eleкtro. ;-)  


Ya está solucionado. Fui al registro de windows  como digiste y vi que había valor llamado FilterCasses en el que hacía referencia al firewall. Entonces fuí al Panel de control para ver la configuración del firewall ya que en ocasiones he recibido notificaciones de  bloqueo del Firewall. Pensé que quizás bloquee algo. Firefox no estaba en las excepecciones y Detección de redes tampoco. Lo checkee como excepción y ahora ya sale el "globo terráqueo".  

No se si será por esto que hice con el FireWall o que pero ahora funciona. Se supone que el Firewall está desactivado, porque es el antivirus el que trabaja como firewall, pero bueno.

De todos modos lo que has puesto me lo guardo para otra...

A mi me gusta que se vea el globo terráqueo, para no tener que iniciar un navegador para saber si estoy conectado o no, ya que no tengo una conexión estable. Y  al pasar el puntero tampoco indicaba nada mediante un mensaje de globo.

Saludos

#724
Hola
En Windows vista no aparece el icono que indica que estoy conectado a internet, es decir, el globo terráqueo no aparece, en su lugar aparece una X de color rojo (no conectado):



Tuve problemas hace unos días con eso pero era aún peor, me indicaba un mensaje que decía que el servicio de detección del estado de conexión estaba desactivado. Restauré el sistema a un punto anterior, y el problema quedó solucionado. Pero un par de días despues otra vez igual, pero ahora no me indica ningún mensaje, ni nada. Sin embargo si que hay conexión.

Agradecería cualquier ayuda, y si es posible especificar. Por ejemplo no decir "activas el servicio de detectción de redes... y listo", pero, ¿Como se llama ese servicio? ¿Cual es su nombre?. Lo digo porque he buscado en Google y suelen contestar así y yo he mirado en la lista en Ejecutar/service.msc y no se cual és, o no está el que comentat. Posiblemente por ser de otro SO.

Saludos y gracias


#726
Hola
A mi me pasó lo mismo hace tiempo...


Este código es una plantilla, un ejemplo. Analízalo (es muy sencillo) y lo aplicas a tu código.

Necisitas un PictureBox, un CommandButton y  un control Timer.

Lo que hace es emular un proceso sin fin o muy largo For/next o Do Loop. Si se pulsa escape en el evento Timer detecta la tecla ESC y le da valor Verdadero a una variable que he llamado PauseProc. Al ser verdadera en el proceso ejecuta una procedimiento llamado Esperar que emula un reloj en segundos (sin timer), y el proceso se pausa. Si se vuelve a pulsar el CommandButton continúa el proceso, que no estaba parado, si no pausado por el proceso Espera. Entonces el Timer continua (para detectar la tecla ESC) y para el proceso Espera y entonces Tu proceso continua.

Puedes crear si quieres  una variable StopProc como boleano y si es Verdadero paras el proceso definitvamente.

Espero que te sirva:

Código (vb) [Seleccionar]
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Dim PauseProc As Boolean
Dim Contador As Long
Private Sub Command1_Click()
'comienza el proceso
Timer1.Enabled = True 'Permite detectar la tecla
PauseProc = False 'Permite reaundar si se había pausado (false= no parar)
SimularProceso 'SIMULA EL PROCESO
End Sub
Private Sub Form_Load()
Contador = 1
   Picture1.AutoRedraw = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
   End 'Evita que no se pueda cerrar
End Sub

Private Sub Timer1_Timer()
Dim msgQuest As Variant
If GetKeyState(vbKeyEscape) < 0 Then PauseProc = True 'para el proceso

If PauseProc = True Then 'Si se ha pulsado ESCAPE
       'Muestra la pregunta
       msgQuest = MsgBox("Desea pausar el proceso", vbYesNo, "Question")
       'Si es no continua el proceso
       If msgQuest = vbNo Then
           PauseProc = False 'Continuar proceso
           Else ' si es sí para el timer (para invalidar ESC)
           Timer1.Enabled = False
       End If
Else 'Si no se ha pulsado nada
   PauseProc = False 'No se pare el proceso
   Timer1.Enabled = True 'Atento si se pulsa ESC
End If
End Sub
'////////////////////////////////////////
'SIMULA UN PROCESO FOR/NEXT O DO/LOOP
'////////////////////////////////////////
Public Function SimularProceso()
For i = Contador To 3 ^ 14
Contador = i 'Memoriza el último estado
   Picture1.Cls
   Picture1.Print i
   DoEvents
'Si se ha pausado pausa durante 3600 segundos (un hora)
If PauseProc = True Then Espera (3600)
Next i
End Function

'////////////////////////////////////////
'Espera un determinado tiempo en segundos
'////////////////////////////////////////
Private Sub Espera(Segundos As Single)
 Dim ComienzoSeg As Single
 Dim FinSeg As Single
 ComienzoSeg = Timer
 FinSeg = ComienzoSeg + Segundos
       If PauseProc = False Then Exit Sub ' Si pulsas continuar deja de esperar
 Do While FinSeg > Timer
     DoEvents
     If ComienzoSeg > Timer Then
         FinSeg = FinSeg - 24 * 60 * 60
     End If
 Loop
End Sub



Esto es una forma muy rebuscada. Pero si quieres en lugar de usar For/next  o Do /Loop metes el proceso en el un Timer y cuando te interese lo estableces a False y cuando quieras reaundar a True. Es más sencillo.
#727
Hola compi :laugh:

Código (vb) [Seleccionar]
'////////////////////////////////////////
'/Agregar los siguientes controles al proyecto:
'////////////////////////////////////////
'/CommandButton1 --name= cmdConectar
'/CommandButton2 --name= cmdEnviar
'/ComboBox1 --name = cmbSel
'/MSComm -- name = Puerto  <---Agregar componente (ctrl+t): Microsoft Comm Control 6.0
'/TextBox --name = txtEnviar
'/Timer1 -- name: Timer1
'/Label -- name: lblMostrar
'////////////////////////////////////////'//////////////////////////////////////////

Dim TextOut, TextIn As String

Private Sub Form_Load()
cmdConectar.Caption = "Conectar"
cmdenviar.Caption = "Enviar"
Timer1.Enabled = False
Timer1.Interval = 1
'Lista los puertos y comprueba su disponibilidad
cmbSel.Clear
Call GetInstalledCOMPorts(cmbSel)
cmbSel.ListIndex = 0
End Sub

Private Sub cmdConectar_Click()
On Error GoTo EvitarError
   If cmdConectar.Caption = "Conectar" Then
       puerto.CommPort = Val(cmbSel.ListIndex + 1)
       puerto.PortOpen = True
       cmdenviar.Visible = True
       Timer1.Enabled = True
       cmdConectar.Caption = "Desconectar"
   End If
  ' procedimiento para desconectar puerto
   If cmdConectar.Caption = "Desconectar" Then
       Timer1.Enabled = False
       cmdenviar.Visible = False
       puerto.PortOpen = False
       cmdConectar.Caption = "Conectar"
   End If
EvitarError:
   If Err Then
   MsgBox "Puerto no disponible", vbExclamation, "Atención"
   End If
End Sub
Private Sub cmdEnviar_Click()
On Error GoTo EvitarError
   TextOut = txtEnviar.Text
   puerto.Output = TextOut
EvitarError:
   If Err Then
   MsgBox "Puerto " & Left(cmbSel.List(cmbSel.ListIndex), 4) & _
   " no conectado", vbExclamation, "Atención"
   End If
   
End Sub
Private Function GetInstalledCOMPorts(ByVal lstCmb As ComboBox) As Long
  Dim Port As Long
  For Port = 1 To 16
     If COMCheckPort(Port) Then
        lstCmb.AddItem "COM" & Port & "  disponible"
     Else
        lstCmb.AddItem "COM" & Port & "  (no disponible o no hay ningún puerto)"
     End If
  Next

End Function
Private Function COMCheckPort(ByVal NumPort As Long) As Boolean
On Error GoTo EvitarError
  puerto.CommPort = NumPort
  If puerto.PortOpen = True Then
     COMCheckPort = False
     Exit Function
  Else
    'Test the port by opening and closing it
     puerto.PortOpen = True
     puerto.PortOpen = False
     COMCheckPort = True
     Exit Function
  End If
EvitarError:
  COMCheckPort = False
End Function

Private Sub Timer1_Timer()
   TextIn = puerto.Input
   If TextIn <> vbNullString Then
       lblMostrar.Caption = TextIn
   End If
End Sub



A ver si te vale... :silbar:
#728
Hola

Esto es un ejemplo de uso de SendMessage para enviar comandos a otras aplicaciones. Se necesita el Handle de la otra aplicación y un código que hace referencia a una acción o evento determinado. Los códigos se pueden encontrar usando la herramienta Spy++ incluida en VB y VB.Net

Este programita permite cambiar las vistas de los iconos del escritorio como si fuera un ListView y también cambia las vistas del Explorador de windows.  Es como hacer "clic" en 'Vistas' del Explorador de Windows pero se hace remotamente desde el programa.

Intrucciones:

- Crea un array con dos controles OptionButton, 5 de cada uno: Option1 y Option2

En un formulario meter esto:

Código (vb) [Seleccionar]
Option Explicit
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

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Const WM_COMMAND = &H111

Private Sub Form_Load()
Option1.Item(0).Caption = "Vista Miniatura"
Option1.Item(1).Caption = "Mosaico"
Option1.Item(2).Caption = "Iconos"
Option1.Item(3).Caption = "Lista"
Option1.Item(4).Caption = "Detalle"

Option2.Item(0).Caption = "Vista Miniatura"
Option2.Item(1).Caption = "Mosaico"
Option2.Item(2).Caption = "Iconos"
Option2.Item(3).Caption = "Lista"
Option2.Item(4).Caption = "Detalle"
End Sub

Public Function VistasEscritorio(ByVal Code As Long)
Dim hwProgMan As Long
Dim hwDesktop As Long
hwProgMan = FindWindow("Progman", "Program Manager")
hwDesktop = FindWindowEx(hwProgMan, &H0, "SHELLDLL_DefView", vbNullString)
SendMessage hwDesktop, WM_COMMAND, Code, &H0
End Function

Public Function VistasExplorador(ByVal Code As Long)
Dim hwExplorer As Long
Dim ListView As Long

'Para XP
hwExplorer = FindWindow("ExploreWClass", vbNullString)
ListView = FindWindowEx(hwExplorer, &H0, "SHELLDLL_DefView", vbNullString)
SendMessage ListView, WM_COMMAND, Code, &H0

'Para Vista/...
hwExplorer = FindWindow("CabinetWClass", vbNullString)
ListView = FindWindowEx(hwExplorer, &H0, "ShellTabWindowClass", vbNullString)
SendMessage ListView, WM_COMMAND, Code, &H0
End Function

Private Sub Option1_Click(Index As Integer)
Dim Code As Long
Select Case Index
Case 0: Code = 28717 'Vista Miniatura
Case 1: Code = 28718 'Mosaico
Case 2: Code = 28713 'Iconos
Case 3: Code = 28715 'Lista
Case 4: Code = 28716 'Detalles
End Select
Call VistasEscritorio(Code)
End Sub
Private Sub Option2_Click(Index As Integer)
Dim Code As Long
Select Case Index
Case 0: Code = 28717 'Vista Miniatura
Case 1: Code = 28718 'Mosaico
Case 2: Code = 28713 'Iconos
Case 3: Code = 28715 'Lista
Case 4: Code = 28716 'Detalles
End Select
Call VistasExplorador(Code)
End Sub

#729
Hola amig@s,

Hace unos días restauré el SO del portátil. El caso es que se me olvidó desconectar el servicio de Bluetooth y configurar el antivirus y el firewall para restringir la conexión de otros usuarios de la red para compartir archivos. Me conecté a una red  Wi-Fi pública de una biblioteca y se me desactivó el servicio de detección de redes, y no hubo forma de volverlo a activar, sin embargo tenía conexión a Internet. Recibí  el siguiente mensaje:

"Recientemente se agregó o eliminó una apliación PIM (Personal Information Management) en el sistema" (relacionado con el Bluetooth".

Además se desactivó la protección sonar del antivirus, que tampoco hubo forma de activarlo. Y en  "red" había un PC con nombre desconocido, es decir, no era el mío.

Finalmente, tuve que reastaurar el sistema a un punto anterior. Para poder solucionar el problema. Desinstalar y volver a instalar el antivirus, actualizarlo y por supuesto esta vez si, desconectar el Bluetooth y desactivar "Permitir que los dispositivos Bluetooth encuentren este equipo" y también "Permite que los elementos Bluetooth puedan enviarle PIM, como tarjetas de presentación, elementos de calendario, mensajes de correo electrónico y notas".

Alguna vez he recibido tarjetas de presentación invitandome a compartir multimedia (teniendo habilitado el Bluetooth). ¿Quién lo hace y porqué?

No se si es que son intentos de intrusió o  que, quizás a traves de un dispositivo mobil. >:(



#730
INSERTAR UN MANIFEST A NUESTRA APLICACIÓN Y EJECUTAR COMO ADMINISTRADOR EN VB6

Hola,
Seguro que hay más de un usuari@ de VB6 que le gustaría que su aplicación creada con VB6 tenga un aspecto actualizado con respecto a los nuevos SO de Microsoft. Además, poder cambiar el nivel de Control de cuentas de usuario de Windows, es decir que requiera iniciarse como "Administrador", de modo que permita acceder al registro y crear claves o modificar valores que requieren privilegios de Administrador.

Hace varios años busqué información en la Web y me costó encontrar un tutorial claro de como hacer simplemente que mi aplicación se ejecutara con nivel de Administrador. Encontré que podías añadir un archivo manifest, pero externo a la aplicación, con lo cual tu aplicación siempre tendría que ir acompañada de dicho archivo. El manifiesto, también permite habilitar los temas para los controles y cuadros de diálogo comunes del XP y posteriores.

Sin embargo, es posible introducir dicho manifiesto dentro de nuestra aplicación y que al iniciarse nuestra aplicación se aplique las instrucciones de dicho manifiesto. Visual Basic .Net ya lo hace de forma automática, y por supuesto es posible modificarlo dentro del entorno de programación.

Existen varios programas como ResourceHacker o PE Explorer que permiten introducir dentro de nuestra aplicación ya compilada, un manifiesto. Sin embargo, no es necesario ningún programa externo a VB6 para introducir un manifiesto en nuestra aplicación. A continuación explico como hacerlo con VB6 y Microsoft Visual C++ 6.0.

He hecho una explicación detallada. Realmente el proceso es muy sencillo, pero por escrito parece más complicado de lo que es realmente. Una vez se conoce el proceso se hace en un momento.

1. Crear un archivo de recursos con Microsoft Visual C++
Antes de nada hay que crear un archivo de recurso con el manifiesto y  compatible con VB6. Para ello iniciamos Microsoft Visual C++ 6.0 que, si lo tienes instalado, encontrarás el acceso directo en el menú inicio en la carpeta de "Microsoft Visual Studio 6.0". Si no lo tienes instalado, inicias el paquete de instalación de Visual Studio 6 y agregas Visual C++.

Bien, una vez iniciado Visual C++, en el menú "Insert" seleccionas "Resource..." o bien pulsa "Ctrl + R".



Del cuadro [Insert Resource] pulsa el botón [Custom]. Aparecerá otro cuadro con el nombre [New custom Resource] que te pide que introduzcas el [Resource Type]. Escribe "24" (sin comillas) y pulsa "OK".




Se creará un cuadro de texto de datos binarios de nombre "Script1-IDR_DEFAULT1 (24)", en el que más adelante, habrá que introducir el manifiesto.





Si esta ventana aparece maximizada, en el menú "Window" selecciona "Tile Horizontally" para poder visualizar el árbol de proyecto.





1.1 Cambiar el nombre del objeto de datos binarios
Haz clic en el árbol con el botón derecho del ratón sobre  "IDR_DEFAULT1" y selecciona propiedades.




Cambia el ID  por "1" (sin comillas) ya que por defecto es "IDR_DEFAULT1". Esto último es muy importante para que el manifiesto funcione. El nombre debe ser 1

Puedes también cambiar la opción "Language", yo pondría "Neutral" que es la primera opción de la lista.



De modo que el árbol queda así:



1.2 Cambiar le nivel de usuario
Llega el momento de introducir nuestro manifiesto, pero antes de hacerlo quizás quieras elegir el nivel de cuenta usuario para tu aplicación. Para ello, habrá que hacer una pequeña modificación en el manifiesto que se muestra más abajo.

Hay tres niveles de cuenta de usuario, a elección personal, para nuestra aplicación.

Fíjate en esta línea del manifiesto anterior:



Los tres niveles de cuenta son:

asInvoker

requireAdministrator

highestAvailable

Si quieres que tu aplicación se ejecute como Administrador cambia "asInvoker" por "requireAdministrator"



La línea quedaría así:

<requestedExecutionLevel level="requireAdministrator " uiAccess="false" />




Manifiesto:

Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"  xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" manifestVersion="1.0">
 <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>

<!-- Opciones del manifiesto de Control de cuentas de usuario-->
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
       <requestedExecutionLevel level="asInvoker" uiAccess="false" />
     </requestedPrivileges>
   </security>
 </trustInfo>

<!-- Habilitar los temas para los controles-->
 <dependency>
   <dependentAssembly>
     <assemblyIdentity
         type="win32"
         name="Microsoft.Windows.Common-Controls"
         version="6.0.0.0"
         processorArchitecture="*"
         publicKeyToken="6595b64144ccf1df"
         language="*"
       />
   </dependentAssembly>
 </dependency>

<!-- Windows seleccionara automaticamente el entorno de mayor compatibilidad-->
     <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
       </compatibility>
</asmv1:assembly>


1.3 Escribir el manifiesto
En el cuadro de texto de datos binarios "1", hay que copiar y pegar el manifiesto mostrado arriba.



(Si habías cerrado el cuadro de textos binarios "1", haz doble clic sobre 1 en el árbol de proyecto para abrirlo de nuevo)

Al pegar el manifiesto el "documento" queda así:




MUY IMPORTANTE  :o
Es esencial para que funcione nuestro manifiesto, que la última línea quede en blanco. En la siguiente imagen puede verse que la última línea 0004f0 no está vacía. Si ocurre esto, nuestro manifiesto no funcionará:



La última línea debe estar vacía, para conseguirlo colocamos el cursor en el último punto (en la parte derecha, donde hay letras) y pulsa 'espacio' cuyo valor hexadecimal es 20, hasta que quede una última línea vacía:




Como puede verse en la imagen de arriba, ahora la última línea es 000500 y está vacía. Repito que esto es esencial  para que funcione el manifiesto en nuestra aplicación, de lo contrario la aplicación no se ejecutará.

1.4 Guardar y crear archivo RES
Después guardas como archivo RES.El cuadro "Guardar como" tiene tres opciones:

Resource Script (.rc)
Resource Template (.rt)
32-bit Resource File (.res)



Guardamos como "32-bit Resource File (.res)". Lo necesitarás para introducirlo en tu aplicación. Puedes elegir el nombre que te de la gana.

Mi consejo es que crees los tres tipos de manifiesto, y los guardes para otras aplicaciones. Pero ten en cuenta que cuando abras el proyecto VB6, éste buscará el archivo RES (archivo de recursos) que hayas vinculado al proyecto y que si en tu proyecto modificas el archivo RES añadiendo imágenes, cursores, iconos, archivos o tablas cadenas, luego, al guardar los cambios el archivo RES quedará modificado. Además, si ha sido movido o borrado cuando inicies el proyecto VB, el archivo RES, lógicamente no se cargará. Lo mejor, una vez creado el archivo RES, es hacer una copia del archivo en la carpeta de nuestro proyecto. Así, cada proyecto que hagamos tendrá su propio archivo RES.

2. Incrustar el manifiesto en la aplicación
Pues llega el momento de coger ese archivo RES que has creado y meterlo en tu aplicación. Para ello necesitamos una herramienta incluida en VB6 llamada "Editor de Recursos de VB6".

Abre tu proyecto de VB6 y ya dentro del entorno de programación ejecutas el Editor de Recursos de VB6. Es posible que no lo tengas habilitado. Para habilitarlo vas al menú "Complementos" y abres el "Administrador de complementos", aparecerá un cuadro con una lista de complementos. Selecciona "Visual Basic 6 Resource Editor" en la lista y marca como "visto"; cargado/Descargado y  Cargar al iniciar.

Bien,  una vez cargado "Visual Basic 6 Resource Editor" debería abrirse una ventana acoplable  y mostrarse un cubo verde en la barra de menú. Si no aparece la ventana del editor o la cierras sin querer, haz clic sobre el cubo verde. También se puede abrir desde el menú "Herramientas".




No encuentro el Editor de Recursos en VB6 :o
¿Cómo? ¿Que no encuentras "Visual Basic 6 Resource Editor"? Esto puede deberse a dos razones, que no has instalado los complementos de VB6 o que probablemente estés ejecutando Windows como invitado o usuario sin privilegios. Al instalarse VB6 se crean unas claves en el registro y ocurre que las claves relacionadas con los complementos y demás las crea en el registro del Administrador pero no en el registro de las cuentas sin privilegios. Por esta razón no aparecen los complementos. Al instalar VB6, Windows no crea estas claves a usuarios sin privilegios de Administrador.

Para solucionar el problema ejecuta VB6 como Administrador y si lo tienes instalado los complementos deberían aparecer en la lista. Hay un truco para poder usar los complementos en una cuenta sin privilegios de Administrador y es, que una vez instalado VB6 desde una cuenta de Administrador, acceder al registro de Windows y extraer todas las claves de VB6, para luego agregarlas, forzadamente, desde la cuenta sin privilegios. Concretamente la clave principal es (incluir las subclaves):

[HKEY_CURRENT_USER\Software\Microsoft\Visual Basic\6.0]

Y  la relacionada con el Editor de Recursos y sus valores es:

[HKEY_CURRENT_USER\Software\Microsoft\Visual Basic\6.0\Addins\ResEdit6.Connect]
"FriendlyName"="#2000"
"Description"="#2001"
"SatelliteDllName"="RsEdt"
"LoadBehavior"=dword:00000000
"CommandLineSafe"=dword:00000000

2.1  Abrir el manifiesto
La ventana del editor de recursos tiene una barra de menú, pulsa "Abrir" (la carpetita amarilla con flecha) o haces clic en la ventana con el botón secundario del ratón y seleccionas "Abrir". Y busca el archivo de recursos que creaste con Visual C++  de formato *.RES para cargarlo.




Al cargar el archivo de recursos con el manifiesto creado con Visual C++, el editor se muestra así:





2.2 Código necesario para el proyecto VB6
Tu proyecto ya tiene cargado un manifiesto. Pero hay un problema, puede que no te funcione en XP o cuando lo ejecutes en  Windows en "Safe Mode" (modo seguro).  Aún queda introducir el siguiente código en tu proyecto:

Código (vb) [Seleccionar]
Private Declare Sub InitCommonControls Lib "comctl32" ()

Private Sub Form_Initialize()
InitCommonControls
End Sub


Así se muestra un formulario VB6 sin el manifiesto.

Sin manifiesto:




Si todo se ha hecho correctamente tu aplicación debería mostrarse así una vez compilada:

Con manifiesto:

En Windows XP


Al ejecutar el programa en Windows XP, algunos controles se verán con un fondo de color negro. Para evitarlo, mete el control dentro de un PictureBox y entonces se verá correctamente.


En Windows Vista



En Windows 7



Y si as aplicado  "requireAdministrator", entonces al abrirla debería mostrar un cuadro de confirmación.


3. Introducir manifiesto en una aplicación ya creada con Microsoft Visual C++
Se pueden introducir manifiestos en aplicaciones ya creadas.

Ejecutas Visual C++ y abres cualquier aplicación como "Resource"




Puedes introducir el manifiesto como se ha explicado anteriormente o bien abres un archivo de recursos ya creado con el manifiesto y lo copias haciendo clic primero con el botón izquierdo sobre "1" o "24" para seleccionar y luego con el botón derecho del ratón y sin soltar arrastrar hacia el proyecto de la aplicación y copiar:












Ahora guardas y ya está hecho.