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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12
101  Programación / Programación Visual Basic / Tutorial: Insertar un manifest y ejecutar como administrador en vb6 en: 10 Marzo 2015, 19:17 pm
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
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <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">
  3.  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  4.  
  5. <!-- Opciones del manifiesto de Control de cuentas de usuario-->
  6.  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
  7.    <security>
  8.      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
  9.        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
  10.      </requestedPrivileges>
  11.    </security>
  12.  </trustInfo>
  13.  
  14. <!-- Habilitar los temas para los controles-->
  15.  <dependency>
  16.    <dependentAssembly>
  17.      <assemblyIdentity
  18.          type="win32"
  19.          name="Microsoft.Windows.Common-Controls"
  20.          version="6.0.0.0"
  21.          processorArchitecture="*"
  22.          publicKeyToken="6595b64144ccf1df"
  23.          language="*"
  24.        />
  25.    </dependentAssembly>
  26.  </dependency>
  27.  
  28. <!-- Windows seleccionara automaticamente el entorno de mayor compatibilidad-->
  29.      <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  30.        </compatibility>
  31. </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
  1. Private Declare Sub InitCommonControls Lib "comctl32" ()
  2.  
  3. Private Sub Form_Initialize()
  4. InitCommonControls
  5. 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.
102  Programación / Programación Visual Basic / Crear un formulario fantasma (solucionado) en: 10 Marzo 2015, 17:32 pm
Hola amigos,

Llevaba no se ya ni cuanto tiempo, buscando una forma de colocar un formulario en el fondo del escritor y que permaneciera ahí como si formara parte del mismo, como un gadget.

Ayer me puse a experimentar con la declaración API, SetLayeredWindowAttributes y modificando el valor dwNewLong  de SetWindowLong y ¡Sorpresa! El formulario permanece siempre en el escritorio y no se puede tocar, ni mover, ni cerrar, ni nada, pero si que se puede ver. Tampoco aparece al pulsar Alt+Tab. Y cuando haces clic en él con el ratón, es como si no existiera. En definitiva, un formulario fantasma. No se cual será el término correcto.

Funciona con el Handle (HWND), de modo que se puede aplicar a cualquier ventana.


He hecho un ejemplo. Es un gigantesco reloj del sistema que se muestra en el escritorio.

Se necesita:
- Un formulario
- Un control PictureBox (para mostra el reloj)
- Un control Timer    (para actualizar reloj)

Modifica las propiedades del form a:
BorderStyle = 0
ShowInTaskbar =False

Esto es para un MÓDULO:

Código
  1. '//////////////////////////////////////////////////////////////////
  2. '//////////////////////////////////////////////////////////////////
  3. '/////Establece el estilo de un formulario a modo fantastasma./////
  4. '/////Características:                                        /////
  5. '/////-Permenece siempre en el fondo del escritorio.          /////
  6. '/////-Es visible.                                            /////
  7. '/////-No se activa mediante el puntero del ratón.            /////
  8. '/////-No se puede mover.                                     /////
  9. '/////-No se puede colocar encima de otro formulario.         /////
  10. '/////-No se puede activar mediante  ALT + TAB.               /////
  11. '/////-Cuando haces clic con el ratón sobre él, se comporta   /////
  12. '///// como si el formulario no existiera. De modo que en el  /////
  13. '///// escritorio aparecerán los menús flotantes o el cuadro  /////
  14. '///// de selección tal y como si no estuviera.               /////
  15. '//////////////////////////////////////////////////////////////////
  16. '//////////////////////////////////////////////////////////////////
  17. '/////////////////////Creado por OKIK//////////////////////////////
  18. '//////////////////////////////////////////////////////////////////
  19.  
  20. Option Explicit
  21. Private Declare Function SetWindowPos Lib "user32" _
  22. (ByVal Hwnd As Long, _
  23. ByVal hWndInsertAfter As Long, _
  24. ByVal X As Long, _
  25. ByVal y As Long, _
  26. ByVal cx As Long, _
  27. ByVal cy As Long, _
  28. ByVal wFlags As Long) As Long
  29. Const HWND_TOP = 0
  30. Const HWND_BOTTOM = 1
  31. Const HWND_TOPMOST = -1
  32. Const HWND_NOTOPMOST = -2
  33. Private Const SWP_NOSIZE = &H1
  34. Private Const SWP_NOMOVE = &H2
  35.  
  36. 'Declaración del Api SetLayeredWindowAttributes _
  37. que establece la transparencia al form
  38. Private Declare Function SetLayeredWindowAttributes Lib "user32" _
  39. (ByVal Hwnd As Long, _
  40. ByVal crKey As Long, _
  41. ByVal bAlpha As Byte, _
  42. ByVal dwFlags As Long) As Long
  43.  
  44. 'Recupera el estilo de la ventana
  45. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
  46. (ByVal Hwnd As Long, _
  47. ByVal nIndex As Long) As Long
  48.  
  49. 'Establece un valor del 32bits para una compensación especificada en la memoria de la ventana extra
  50. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  51. (ByVal Hwnd As Long, _
  52. ByVal nIndex As Long, _
  53. ByVal dwNewLong As Long) As Long
  54.  
  55. Public Const LWA_ALPHA = &H2               'Crea una capa alfa (transparencia)
  56. Public Const LWA_NULLCOLOR = &H1           'Anula un color especificado
  57. Public Const LWA_ALPHA_NULLCOLOR = &H3     'Crea una capa alfa y anula un color especificado
  58. Public Const LWA_NORMAL = &H0              'Normal, sin trasnparencia y sin anulación color
  59. Public Const RMV_COLOR_BLACK = &H0         'Color para anular (negro)
  60. Public Const RMV_COLOR_MAGENTA = &HFF00FF  'Color para anular (magenta)
  61. Private Const GWL_EXSTYLE = (-20)
  62. Private Const WS_EX_LAYERED = &H80000       'Estilo de capa
  63. Private Const WS_EX_GHOSTFORM = &H64        'Estilo fantasma
  64.  
  65. Private Function SendFormBottom(ByVal Hwnd As Long)
  66. 'Envia el formulario al fondo la primera vez que se ejecuta
  67. SetWindowPos Hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
  68. End Function
  69. Public Function SetGhostForm(ByVal Hwnd As Long, _
  70. ByVal NivelTransparencia As Integer, _
  71. ByVal NullColor As Long, _
  72. ByVal TypeLayer As Long) As Long
  73. Dim X As Long
  74. Dim lpPrevWndProc As Long
  75. On Error Resume Next
  76.       X = GetWindowLong(Hwnd, GWL_EXSTYLE)
  77.       X = X Or WS_EX_LAYERED Or WS_EX_GHOSTFORM
  78.       SetWindowLong Hwnd, GWL_EXSTYLE, X
  79.       NivelTransparencia = Int(((NivelTransparencia * 255) / 100) + 0.5)
  80.       SetLayeredWindowAttributes Hwnd, NullColor, NivelTransparencia, TypeLayer
  81.       SetGhostForm = 0
  82.       SendFormBottom Hwnd
  83. If Err Then
  84. SetGhostForm = 2
  85. End If
  86. End Function
  87.  
  88.  

Y esto para el FORMULARIO

Código
  1. Private Sub Form_Activate()
  2. 'SetGhostForm (Handle, Trasnparencia, Color para anular, Tipo de capa)
  3. 'Mantiene el formulario siempre abajo
  4. Call SetGhostForm(Me.Hwnd, 45, RMV_COLOR_BLACK, LWA_ALPHA_NULLCOLOR)
  5. End Sub
  6.  
  7. Private Sub Form_Load()
  8.    With Picture1
  9.        .Font = "Arial"
  10.        .ForeColor = vbGreen
  11.        .BackColor = vbBlack
  12.        .FontSize = 100
  13.        .AutoRedraw = True
  14.        .Move 0, 0, 8000, 2000
  15.        .BorderStyle = 0
  16.    End With
  17.    Timer1.Enabled = True
  18.    Timer1.Interval = 1
  19. End Sub
  20. Private Sub Form_Resize()
  21.    Me.Move Screen.Width - Me.Width - 100, 0, _
  22.    Picture1.Width, Picture1.Height
  23. End Sub
  24.  
  25. Private Sub Timer1_Timer()
  26.    With Picture1
  27.        Picture1.Cls
  28.        Picture1.CurrentX = 150
  29.        Picture1.CurrentY = 15
  30.        Picture1.Print Time
  31.    End With
  32. End Sub
  33.  

Lo malo es que los accesos directos no se superponen sobre el formulario, sino que se quedan debajo. Pero lo curioso es que aunque estén debajo, si haces doble clic sobre ellos (con el form encima), se pueden mover o ejecutar igualmente.

He hecho lo del reloj sólo como un ejemplo de utilidad, pero para crear un formulario fantasma basta con hacer la llamada a SetGhostForm que se encuentra en el módulo.  No funciona desde Form_Load, solo en Form_Resize y Form_Activate


Si no quieres transparencia, ni remover ningún color, usa LWA_NORMAL:

Call SetGhostForm(Me.Hwnd, 0, 0, LWA_NORMAL)


Si solo quieres transparencia usa LWA_ALPHA y estableces un valor entre 0 y 100, cuanto menor sea el valor más transparente se volverá el formulario:

Call SetGhostForm(Me.Hwnd, 100, 0, LWA_ALPHA)


LWA_ALPHA_NULLCOLOR, permite hacer las dos cosas:

Call SetGhostForm(Me.Hwnd, 50, RMV_COLOR_BLACK, LWA_ALPHA_NULLCOLOR)

103  Programación / Programación Visual Basic / Refrescar Escritorio de Windows y Explorador de Carpetas (solucionado) en: 10 Marzo 2015, 16:52 pm
Hola,
He buscado y rebuscado en la red y finalmente encontré la forma de refrescar el escritorio de windows y el Explorador de carpetas (Explorer)

Esto sirve para cuando cambias valores en el registro directamente desde tu programa, en lugar de usar Opciones de Carpeta. Por ejemplo, ocultar las extensiones de archivo, mostrar archivos ocultos o  mostrar vistas en miniaturas en lugar de iconos. Al refrescar automáticamente se muestran los cambios; si deshabilitas las extensiones de archivo, al refrescar (actualizar) se ocultan las extensiones.

Yo intuía que debía usar PostMessage o SendMessage, lo que no sabía era que comando usar. Finalmente los encontré pero referido a otros tipos de lenguaje, no para VB. He encontrado otras formas con VB pero no funcionaban o solamente funcionaban para el escritorio. Como explico más abajo, todo se tiene que hacer por separado: escritorio, explorador de windows y actualizar iconos.


Código completo y definitivo para refrescar el escritorio, el explorador de carpetas y ACTUALIZAR LOS ICONOS en XP/Vista/¿Windows 7/8?:

Código
  1. Option Explicit
  2. Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
  3. (ByVal hwnd As Long, ByVal wMsg As Long, _
  4. ByVal wParam As Long, ByVal lParam As Long) As Long
  5. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  6. (ByVal hwnd As Long, ByVal wMsg As Long, _
  7. ByVal wParam As Long, lParam As Any) As Long
  8. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  9. (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  10. Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
  11. (ByVal hWnd1 As Long, _
  12. ByVal hWnd2 As Long, _
  13. ByVal lpsz1 As String, _
  14. ByVal lpsz2 As String) As Long
  15.  
  16. Private Const WM_COMMAND = &H111
  17. Private Const SC_REFRESH_DESKTOP = &H7103
  18. Private Const SC_REFRESH_EXPLORER_VISTA = &HA220
  19. Private Const SC_REFRESH_EXPLORER_XP = &H7FEF
  20.  
  21. 'Función para actualizar los iconos
  22. Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" _
  23. (ByVal hwnd As Long, ByVal msg As Long, _
  24. ByVal wParam As Long, ByVal lParam As Long, _
  25. ByVal fuFlags As Long, ByVal uTimeout As Long, _
  26. lpdwResult As Long) As Long
  27.  
  28. Private Const WM_SETTINGCHANGE = &H1A
  29. Private Const HWND_BROADCAST = &HFFFF&
  30. Private Const SPI_SETNONCLIENTMETRICS = 42
  31. Private Const SMTO_ABORTIFHUNG = &H2
  32.  
  33.  
  34. Public Function RefreshDesktop()
  35. Dim hwProgMan As Long, hwDesktop As Long, hwExplorer As Long
  36.  
  37. 'Refresca el escritorio
  38. hwProgMan = FindWindow("Progman", "Program Manager")
  39. hwDesktop = FindWindowEx(hwProgMan, &H0, "SHELLDLL_DefView", vbNullString)
  40. PostMessage hwDesktop, WM_COMMAND, SC_REFRESH_DESKTOP, &H0
  41.  
  42. 'Refresca explorer
  43. 'VISTA/¿Windows 7/8?
  44. hwExplorer = FindWindow("CabinetWClass", vbNullString)
  45. PostMessage hwExplorer, WM_COMMAND, SC_REFRESH_EXPLORER_VISTA, &H0
  46. 'XP
  47. hwExplorer = FindWindow("ExploreWClass", vbNullString)
  48. PostMessage hwExplorer, WM_COMMAND, SC_REFRESH_EXPLORER_XP, &H0
  49.  
  50. 'Actualiza los iconos
  51. Call SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, &H0, SMTO_ABORTIFHUNG, &H1, &H0)
  52. End Function
  53.  
  54. Private Sub Command1_Click()
  55. RefreshDesktop
  56. End Sub

'//////////////////
Tuve una errata ayer con el nombre de clase del explorador de windows para Windows XP; le añadí una R de más. La culpa es de google :¬¬ Como no estaba seguro busqué ahí y encontre referencias escrito así y bueno, esa es la escusa. Lo he corregido :D.

El nombre de clase de Explorer para XP es: "ExploreWClass". Con toda seguridad, lo he comprobado personalmente.

De todos modos el código o comando para refrescar Explorer en XP es diferente que en Vista o Windows 7. De modo que tampoco iba a funcionar aunque hubiera escrito bien el nombre de clase. Ayer comprobé cual era el comando a usar con spy++ y lo he añadido.

He añadido además el código para actualizar los iconos porque no se actualizaban los iconos. Esto es, cuando cambias el icono por defecto de una determinada extensión de archivo directamente en el registro de windows y quieres ver los cambios sin tener que cerrar sesión o simular un cambio en Opciones de carpeta.

No me extraña que no encontrara la forma de refrescar windows. Parece ser que hay que hacerlo todo por separado, por un lado el escritorio, por el otro Explorer y por el otro actualizar los iconos.


Como se puede ver, en XP el código wParam es &H7FEF=32751. Lo he testado y ¡funciona!.
104  Programación / .NET (C#, VB.NET, ASP) / Solucionar Error NullReferenceException en VB.Net 2010 en: 6 Marzo 2015, 16:52 pm
Hola,

Se trata de un código para loggear. Rellena de forma automático al login de una página.

Código
  1. Dim theElementCollection As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  2.            For Each curElement As HtmlElement In theElementCollection
  3.                Dim controlName As String = curElement.GetAttribute("id").ToString
  4.                If controlName = idUser Then
  5.                    curElement.SetAttribute("Value", UserName)
  6.                End If
  7.            Next


El error se produce en ("Input").y es "NullReferenceException"---> "Referencia a objeto no establecida como instancia de objeto"

Si coloco el código en el evento WebBrowser1_DocumentCompleted entonces no se produce ningún error pero me interesa introducirlo en un evento Click de un botón.


Nota:

idUser  es una variable string con el id del control de la página donde hay que introducir el nombre de usuario

UserName es una variable string para el nombre del usuario

105  Foros Generales / Dudas Generales / ¿Quién o qué organismo censura Internet en España? en: 25 Febrero 2015, 14:38 pm
Hola,
Aunque hacía programas, nunca me he dedicado al hackeo. Últimamente por curiosidad he empezado a buscar información sobre hackeo en Internet para hacer esto o aquello, sin ninguna maldad ni interés de hacer daño. Solo por saber como va.

Sin embargo, cual es mi sorpresa cuando me encuentro que Internet está censurado. Mi IP da información de donde procede mi conexión, que en este caso es España, cuando trataba de entrar en determinadas páginas extranjeras no podía. Ayer introduje el complemento Hola! un VPN a Chrome para que parezca que me estoy conectando desde UK o USA o cualquier otro país  y pueda tener acceso a determinada información. Pero que casualidad, hoy ya no funciona.
Para poder hacerlo he utilizado los siguientes enlaces:

(copia y pega "chrome://net-internals/#sockets" en el Omnibox)

Madre mía, en menos de cinco minutos encontré la información que buscaba. ¿Quién demonios censura Internet en España? ¿El gobierno? ¿Por qué? No lo entiendo.
106  Seguridad Informática / Hacking / Como protegerme de intrusiones y sniffing en un red Wifi pública en: 24 Febrero 2015, 14:45 pm
Uso muy a menudo una red pública. Uso el antivirus Norton Internet Security, que se supone me protege  de ello. Lo he configurado para restringir cualquier conexión de cualquier usuario de la red a mi compu.  Tengo vista y entro como usuario con limitaciones, de modo que cualquier cambio de configuración o instalación de un programa requiere introducir contraseña. Nunca meto contraseñas manualmente, con teclado.

Aunque se programar nunca me he dedicado al hackeo, más para "hackear" algún programilla que otro, pero estoy muy verde en estas cosas.  Me estoy descargado Ettercap (espero que no tenga malware), para ver como va. Pero dudo que me aclare como evitar ser "sniffado".

Se que alguien me puede hacer mitm (Man In The Middle), es precisamente lo que quiero evitar, ¿pero como?.

Saludos
107  Programación / Programación Visual Basic / Como puedo Ofuscar mi IP usando InPrivate desde WebBrowser VB6 o VB.Net en: 20 Febrero 2015, 16:49 pm
Hola,
pues eso. Quisiera saber si hay alguna manera usar InPrivate con WebBrowser. 
108  Programación / .NET (C#, VB.NET, ASP) / ¿Es posible cambiar el ClassName de un Form en VB6 o VB.NET2010? en: 10 Febrero 2015, 20:09 pm
Hola

LLevo infinidad de tiempo intentando encontrar la manera de cambiar el nombre de clase un formulario creado en VB6 o VB.NET. Pero no he encontrado la forma.

ClassName en VB6:
ThunderRT6FormDC fuera del entorno de programación
ThunderFormDC dentro del entorno de programación

ClassName en VB.NET
WindowsForms10.Window.8.app...

Sé que es posible establecer tu propio ClassName si creas el form desde cero mediante CreateWindowEx. Pero los usuarios de VB estamos mal acostumbrados y eso de tener que crear las cosas de forma "imaginaria" y que solo sean visibles cuando se ejecuten.... es un rollo. No hay ganas.

Lo curioso es que jamás me he encontrado ninguna aplicación, ni grande, ni pequeña, que tubiese el nombre de clase (ClassName) como ThunderRT6FormDC. Luego, ¿Nadie que se dedique profesionalmente  ha utilizado VB para crear sus apliaciones? o bien, ¿sí que es posible cambiarlo.?

A ver si algún gurú de la programación me lo sabe explicar.

109  Programación / Programación Visual Basic / ¿Es posible crear un paquete de instalación en VB.Net2010 sin archivo msi? en: 9 Febrero 2015, 18:39 pm
Hola,

Apenas acabo de empenzar a programar en VB.net2010 y me encuentro que al crear un paquete de instalación se crea una dependéncia con un archivo *.msi donde está contenido los archivos del programa. Esto no es del todo un problema. El problema está en que, una vez realizada la instalación, al ejecutar el programa windows busca el archivo msi de la isntalación, lo cual es un palo enorme ya que me obliga a tener el archivo msi siempre disponible para ejecutar el programa.
110  Programación / Programación Visual Basic / Descargar archivos grandes con API en VB6 en: 5 Febrero 2015, 16:30 pm
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
  1. Private Declare Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" (ByVal pCaller As Long,  _
  2. ByVal szURL As String,  _
  3. ByVal szFileName As String,  _
  4. ByVal dwReserved As Long,  _
  5. ByVal lpfnCB As Long) As Long
  6. Dim Contador As Integer
  7.    Const ERROR_SUCCESS As Long = 0
  8.    Const INTERNET_FLAG_RELOAD As Long = &H80000000
  9.    Const BINDF_ASYNCHRONOUS = &H1
  10.    Const BINDF_ASYNCSTORAGE = &H2
  11.    Const BINDF_NOPROGRESSIVERENDERING = &H4
  12.    Const BINDF_OFFLINEOPERATION = &H8
  13.    Const BINDF_GETNEWESTVERSION = &H10 ' El funcionamiento del lazo debe recuperar la más nueva versión de los datos.
  14.    Const BINDF_NOWRITECACHE = &H20
  15.    Const BINDF_NEEDFILE = &H40
  16.    Const BINDF_PULLDATA = &H80
  17.    Const BINDF_IGNORESECURITYPROBLEM = &H100
  18.    Const BINDF_RESYNCHRONIZE = &H200
  19.    Const BINDF_HYPERLINK = &H400
  20.    Const BINDF_NO_UI = &H800
  21.    Const BINDF_SILENTOPERATION = &H1000
  22.    Const BINDF_PRAGMA_NO_CACHE = &H2000
  23.    Const BINDF_FREE_THREADED = &H10000
  24.    Const BINDF_DIRECT_READ = &H20000
  25.    Const BINDF_FORMS_SUBMIT = &H40000
  26.    Const BINDF_GETFROMCACHE_IF_NET_FAIL = &H80000
  27.  
  28.  
  29.  
  30. Public Function DownloadFile(URL As String,  _
  31. LocalFilename As String) As Boolean
  32.    Dim lngRetVal As Long
  33.    lngRetVal = URLDownloadToFile(0&, URL, LocalFilename, BINDF_ASYNCHRONOUS , 0&)
  34.    If lngRetVal = 0 Then DownloadFile = True
  35. End Function
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines