Mar 012021
 

Hola en esta ocasión un poco más de lo mismo ya en el blog hay 3 artículos más referidos a menús, pero bien, esta clase se trata de armar un menú popup con apis de una forma más sencilla y con varias propiedades que vb6 no contiene, algunas de ellas son: ItemBitmap, ItemRadioCheck, ItemDefault, ItemHilite, ítems en columna (Break).

Como plus hay un módulo que sirve para leer imágenes, con un tamaño específico, esto esta pensado más que nada para soporte del DPI.

Dentro del módulo está la función llamada LoadPictureEx con la que podemos pasarle como primer parámetro:

  • Un Array de bits de la imagen
  • El path de la imagen
  • Una Url web de la imagen
  • Una url con la imagen codificada en ella «data:image/png;base64,iVBORw…»
  • Un objeto Stream (devuelto por algunas librerías de windows)
  • Un hBitmap
  • un hIcon

El segundo y tercer parámetro es el alto y ancho de la imagen. El tercero boolean si queremos que se ajuste a ese ancho o que sea proporcional. El cuarto parámetro el formato de salida vbPicTypeBitmap o vbPicTypeIcon. El quinto parámetro es un color, para esas imágenes tipo vectoriales de un solo color, con esta función podemos pintarlas a ese color (aclaro no tiene soporte para SVG). El sexto parámetro BackColor, sería por si es un png y lo queremos mostrar en un control imagen, elegimos su color de fondo.

la función retorna un iPicture o StdPicture con un Bitmap o Icono con una imagen de 32Bits de profundidad, la cual sirve para pasar a los common controls. y el menú por supuesto. también se pude utilizar con el icono del formulario con SendMenssage, el SysTray etc etc etc.

ClsApiMenu.png
Dic 192020
 

Este proyecto me lo compartió el colega J. Elihu quien fue que lo trabajo, así que les dejo como descripción su propio Readme.txt para que entiendan mejor. Se los recomiendo!

CONTENIDO:

  1. ¿Que es vbSqlite?
  2. Caracteristicas
  3. ¿Como usar?
  4. Licencia

  1. ¿Qué es vbSqlite3?

SQlite3 + VB6: vbSqlite3 es un envoltorio (ligero,entendible) que permite
integrar el motor de base de datos de SQlite con las aplicaciones de VB6
Todo estos sin generar dependencias (ODBC, ADO y DLL’s activex) y usando
las versiones actuales del MDB de SQlite3.

REQUERIMIENTOS

- Sqlite3.dll   -> MDB de Sqlite.
- cLib      -> Conectar Sqlite3.dll + VB6.
- cSqlite   -> Conexión a la base de datos.
- cSqliteCursor -> Manejador de consultas a la base de datos.

CREDITOS

- Cobein   (mSqlite.bas)
- Cocus    (cSQLiteConnection.cls)
- Cocus    (cSQLiteRecordset.cls)

  1. Caracteristicas

vbSqlite3 implementa todas las funciones requeridas para una conexión con
el motor de base de datos de SQlite, adicionalmente implementa rutinas,
propiedades y funciones que facilitan su uso y claro entendimiento.
El envoltorio permite:

- Ejecutar commandos SQL de SQlite.
- Adjuntar varias bases de datos a una conexión de SQlite.
- Copia de seguridad de la 'db' (backup).
- Eliminar los espacios en blanco de la 'db' (vacuum)
- Configurar el modo WAL de la 'db'
- Cambiar la codificación de la 'db'
- Activar/Desactivar la restrición de claves foraneas.
- Cambiar el modo de sincronización de la 'db'.
- Obtener el código y mensaje de error.
- Insertar/Actualizar datos mediante un objeto de consulta
  (cSqliteCursor) - (Sqlite_bind_*).
- Reestablecer los objetos de consulta (reset).
- Obtener los campos BLOB de una consulta.
- Adjuntar datos a una declaracion preparada (Sqlite_bind_*).
- Obtener la ID del ultmio registro insertado.
- Obtener la cantidad de registros afectados por una consulta.
- Ejecutar transacciones desde una coleccion de sentencias SQL.
- Obtener y establecer la version de usuario(UserVersion).
- Crear multiples instancias de conexión (cSqlite).
- Cargar la libreria de SQlite desde una ruta personalizada.

Las actualizaciones posteriores del envoltorio pueden incluir nuevas
características y funciones.


  1. ¿Como usar?

Se incluye la demo en el proyecto como guia de incio rápido para el uso del
envoltorio.

1 - Incluya Sqlite3.dll en la carpeta de su proyecto, o en la carpeta
    System32, o cargue la dll desde una ruta personalizada.
2 - Cree una nueva instancia de cSqlite y establezca la conexión.
3 - Llame a cSqlite.Execute para ejecutar sentencias SQL.
4 - Llame a cSqlite.Query para instanciar un nuevo objeto de consulta.
5 - Para interactuar con el objeto de consulta, segun el caso, llame a: 
    cSqliteCursor.Step
    cSqliteCursor.Value
    cSqliteCursor.BLOB
    cSqliteCursor.Bind
    cSqliteCursor.Reset
6 - Para finalizar la conexión, destruya primero la instancia del
    objeto de consulta (cSqliteCursor) y luego la instancia de la
    conexión(cSqlite).

Para Añadir/Actualizar/Remover datos mediante un objecto de declaracion
preparada debe usar la rutina: ‘cSqliteCursor.Bind’. Para mayor información
consultar la documentacion oficial: https://www.sqlite.org/docs.html


  1. Licencia

  - El envoltorio 'vbSqlite3' es gratuito.
- El envoltorio es de propiedad del autor.
- Se puede editar/cambiar/redistribuir el codigo manteniendo los
  creditos del autor.
- Se permite redistribuir el codigo fuente siempre que no se cobra
  ninguna tarifa.

J. Elihu
E-mail: elihulgst.10@gmail.com

vbsqlite3_1.jfif
vbsqlite3_2.jfif
vbsqlite3_3.jfif
Sep 102018
 

Se trata de un modulo clase que se encarga de simular una barra de titulo, lo que en realidad hace es eliminar la original y dibujar una personalizada en el área cliente (osea dentro del mismo formulario) la clase empezó un poco jugando luego fui modificando muchas cosas ,en un principio para dibujar los botones utilizaba los temas de windows (nada fácil ya que para pintar tal como se ven en la imagen había que hacer unas cuantas piruetas) luego decidí que era mas fácil utilizar métodos gráficos con GDI+ y hacerlos yo mismo, inclusive es mucho mas rápido así.

Seguramente quien vea la chorrera de código dirán para que tango lío, si sacando el borde del formulario ya esta, pero bien a mi gusto entre muchas otras cosas es preservar la sombra del formulario y otras cuestiones como que el usuario pueda cambiar el tamaño, simular a las aplicaciones que hay en el store de microsoft y etc etc.

bien las opciones del modulo es cambiar el color de la barra elegir si se quiere entre iconos y etiqueta blanca u oscura, y bien como ven en la imagen se puede agregar controles o dibujar sobre la barra, dentro del zip hay un ejemplo donde se muestra como hacerlo, las opciones son muchas es cuestión de que sepan aprovecharlas. si bien es compatible en windows XP y superiores, esta pensado para windows 10.

Actualizado 16/10/2018: ahora soporte para el escalado de DPI

CustomTitleBar.png
CustomTitleBar.png

 Posted by at 0:26
Dic 172016
 

Este código hace tiempo que había quedado pendiente en un hilo del foro por el amigo 79137913 el cual sirve para recuperar contraseñas guardadas en Windows 8 y posteriores, haciendo un breve resúmen en versiones anteriores Internet explorer (IE7) éste almacenaba sus contraseñas en el registro de windows, las cuales utilizando algunas apis de desencriptación se podían obtener todos los datos. Con la llegada de Windows 8 el sistema cambió y comenzaron a guardarlas en Windows Vault, si nos metemos desde el Administrador de credenciales podemos ver todas las contraseñas guardas con sus respectivos Usuarios y Url.

Me dió mucho trabajo poder traducir el código de C, ya que son todas apis indocumentadas y el manejo desde VB y los punteros a las estructuras es un tanto engorroso, pero tras prueba y error pude  lograr recuperar las contraseñas.

Tanto I.Explorer como Microsoft Edge guardan las contraseñas en el mismo lugar con el mismo seudónimo (Intenet Explorer) (ya sabemos que ambos son la misma cosa).

El código se puede resumir si se quiere, pero traté de mantener todas las estructuras y enumeraciones para que sea más entendible su funcionamiento o poder usar otras funcionalidades de las credenciales.

(Aclaro esto sólo sirve en Windows 8 y posteriores, si bien las credenciales estaban disponibles en Windows 7, mi  internet explorer no almacenaba sus contraseñas en vault, y si estoy equivocado es fácil corregir, sólo hay que verificar la versión de windows y cambiar la estructura según el S.O.).


Option Explicit
Private Declare Function VaultOpenVault Lib "vaultcli.dll" (ByRef VaultGuid As GUID, ByVal dwFlags As Long, ByRef VaultHandle As Long) As Long
Private Declare Function VaultCloseVault Lib "vaultcli.dll" (ByRef VaultHandle As Long) As Long
Private Declare Function VaultEnumerateItems Lib "vaultcli.dll" (ByVal VaultHandle As Long, ByVal dwFlags As Long, ByRef ItemsCount As Long, ByRef Items As Long) As Long
Private Declare Function VaultGetItem Lib "vaultcli.dll" (ByVal VaultHandle As Long, pSchemaId As GUID, ByVal pResource As Long, ByVal pIdentity As Long, ByVal pPackageSid As Long, ByVal hwndOwner As Long, ByVal dwFlags As Long, ppItem As Long) As Long
Private Declare Function VaultFree Lib "vaultcli.dll" (ByVal ppItem As Long) As Long

Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long


Private Enum VAULT_SCHEMA_ELEMENT_ID
 ElementId_Illegal = 0
 ElementId_Resource = 1
 ElementId_Identity = 2
 ElementId_Authenticator = 3
 ElementId_Tag = 4
 ElementId_PackageSid = 5
 ElementId_AppStart = &H64
 ElementId_AppEnd = &H2710
End Enum
 
Private Enum VAULT_ELEMENT_TYPE
 ElementType_Boolean = 0
 ElementType_Short = 1
 ElementType_UnsignedShort = 2
 ElementType_Integer = 3
 ElementType_UnsignedInteger = 4
 ElementType_Double = 5
 ElementType_Guid = 6
 ElementType_String = 7
 ElementType_ByteArray = 8
 ElementType_TimeStamp = 9
 ElementType_ProtectedArray = 10
 ElementType_Attribute = 11
 ElementType_Sid = 12
 ElementType_Last = 13
 ElementType_Undefined = -1
End Enum

Private Type FILETIME
 dwLowDateTime As Long
 dwHighDateTime As Long
End Type

Private Type VAULT_VARIANT
 veType As VAULT_ELEMENT_TYPE
 Unknown As Long
 lpString As Long
End Type
 
Private Type VAULT_ITEM_ELEMENT
 SchemaElementId As VAULT_SCHEMA_ELEMENT_ID
 Unknown As Long
 ItemValue As VAULT_VARIANT
End Type
 
Private Type GUID
 Data1 As Long
 Data2 As Integer
 Data3 As Integer
 Data4(0 To 7) As Byte
End Type
 
Private Type VAULT_ITEM_W8
 SchemaId As GUID
 pszCredentialFriendlyName As Long
 pResourceElement As Long ' VAULT_ITEM_ELEMENT
 pIdentityElement As Long ' VAULT_ITEM_ELEMENT
 pAuthenticatorElement As Long ' VAULT_ITEM_ELEMENT
 pPackageSid As Long ' VAULT_ITEM_ELEMENT
 LastModified As FILETIME
 dwFlags As Long
 dwPropertiesCount As Long
 pPropertyElements As Long ' VAULT_ITEM_ELEMENT
End Type

Private Type VAULT_ITEM_W7
 SchemaId As GUID
 pszCredentialFriendlyName As Long
 pResourceElement As Long ' VAULT_ITEM_ELEMENT
 pIdentityElement As Long ' VAULT_ITEM_ELEMENT
 pAuthenticatorElement As Long ' VAULT_ITEM_ELEMENT
 LastModified As FILETIME
 dwFlags As Long
 dwPropertiesCount As Long
 pPropertyElements As Long ' VAULT_ITEM_ELEMENT
End Type

Const WEB_CREDENTIALS As String = "{4BF4C442-9B8A-41A0-B380-DD4A704DDB28}"
Const VAULT_ENUMERATE_ALL_ITEMS = 512
 
Public Function GetVaultCredentials() As String
 Dim tGUID As GUID
 Dim hVault As Long
 Dim ItemsCount As Long, i As Long
 Dim Items As Long
 Dim VI_W8() As VAULT_ITEM_W8
 Dim dwError As Long
 Dim ppCredentials As Long 'VAULT_ITEM_W8
 Dim tVIE As VAULT_ITEM_ELEMENT
 Dim sResult As String
 Dim tItemVault As VAULT_ITEM_W8
 
 CLSIDFromString StrPtr(WEB_CREDENTIALS), tGUID
 
 If VaultOpenVault(tGUID, 0, hVault) <> 0 Then Exit Function
 
 Call VaultEnumerateItems(hVault, 0, ItemsCount, Items)
 ReDim VI_W8(ItemsCount - 1)
 CopyMemory VI_W8(0), ByVal Items, Len(VI_W8(0)) * ItemsCount
 
 For i = 0 To ItemsCount - 1
 If VI_W8(i).dwPropertiesCount <> 0 Then
 
 dwError = VaultGetItem(hVault, VI_W8(i).SchemaId, VI_W8(i).pResourceElement, VI_W8(i).pIdentityElement, 0&, 0&, 0&, ppCredentials)

 If dwError = 0 Then
 sResult = sResult & "Account: " & PtrToString(VI_W8(i).pszCredentialFriendlyName)
 
 CopyMemory tVIE, ByVal VI_W8(i).pResourceElement, Len(tVIE)
 
 sResult = sResult & " URL: " & PtrToString(tVIE.ItemValue.lpString)
 
 CopyMemory tVIE, ByVal VI_W8(i).pIdentityElement, Len(tVIE)
 
 sResult = sResult & " User: " & PtrToString(tVIE.ItemValue.lpString)

 CopyMemory tItemVault, ByVal ppCredentials, Len(tItemVault)
 CopyMemory tVIE, ByVal tItemVault.pAuthenticatorElement, Len(tVIE)
 
 sResult = sResult & " Pass: " & PtrToString(tVIE.ItemValue.lpString) & vbCrLf
 
 VaultFree (ppCredentials)
 ppCredentials = 0
 End If
 End If
 Next

 VaultCloseVault (hVault)
 
 GetVaultCredentials = sResult
End Function
 
Private Function PtrToString(lpwString As Long) As String
 Dim Buffer() As Byte
 Dim nLen As Long
 If lpwString Then
 nLen = lstrlenW(lpwString) * 2
 If nLen Then
 ReDim Buffer(0 To (nLen - 1)) As Byte
 CopyMemory Buffer(0), ByVal lpwString, nLen
 PtrToString = Buffer
 End If
 End If
End Function

Private Sub Form_Load()
 Text1.Text = GetVaultCredentials
End Sub
Abr 252013
 

Este es un módulo clase que sirve para capturar sitios web y poder guardarlos como una imágen, utiliza el motor de Internet explorer. La clase cuenta con un evento y varias propiedades y funciones a modo de ser flexible para cada uso, entre éstas, poder guardar la imágen en varios formatos, PNG, JPG, ICO, etc., tanto en archivo como en stream. Además captura el Favicon de la web en cuestión, como así también otros datos como la descripción y el titulo. Podemos elegir las dimensiones que queramos como entrada y salida.

Como requerimiento sistema operativo Windows XP y posteriores (aunque sólo lo probé en Windows 7, pero no creo que haya inconvenientes).

A continuación pondré tres proyectos en los que utilizaré el módulo clase y mostraré un poco para qué podría servir.

…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….

El primero se trata de un  proyecto algo simple para mostrar un poco como funciona la clase y sus propiedades.

Snap Website

Snap Website

…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….

El segundo se trata de un proyecto más avanzado, con algunos controles de usuario y módulos extra para crear una ventana donde podamos alojar algunos sitios web como accesos directos y mediante algunas combinaciones de teclas mostrar esta ventana. Para más información ver el archivo Leame.txt que se encuentra junto al proyecto.

Para apreciar mejor este proyecto recomiendo compilarlo y tener el tema Aero corriendo (claro ésto si su sistema operativo es windows vista o posterior) en la siguiente captura pueden apreciar una linda interfaz.

Mis Sitios favoritos

Mis sitios favoritos

…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….

Y el tercero se trata de un proyecto para crear los clásicos accesos directos en el explorer de windows, con la diferencia que éste permite poner como icono la  miniatura de la web, el icono generado cuenta con cuatro dimensiones  256×256 (PNG), 48×48, 32×32 y 16×16, los dos últimos son representados por el favicon de la web (si es que lo tiene).

En este proyecto utilicé IShellLink.tlb  para poder crear los accesos directos, ya que fue la mejor opción que encontré para solventar las teclas de acceso rápido.

Nota: los iconos los almacenará en la misma carpeta que el proyecto, si se genera un acceso directo, esta carpeta no debe moverse más para que no se pierda la referencia al icono, por lo que recomiendo, al descomprimir el proyecto elegir una ubicación permanente.

Mar 072013
 

Con la aparición de los nuevos móviles es más frecuente ver imágenes que contienen las coordenadas GPS de donde se tomaron las fotos, esto es aprovechado por algunas redes sociales para sugerir la ubicación de la captura. Si lo desean pueden fijarse desde alguna imágen tomada con el celular, si la tienen almacenada en su PC , dentro de las propiedades (en la pestaña detalles) van a ver las coordenadas, entre otros datos tales como: el tipo de cámara, fecha de captura y demás. Estos datos denominados EXIF o Metadatos, están incrustados en la imágen (como si fuera un archivo de recursos) y es común en los archivos jpg, pero esto no implica que los demás formatos no puedan contener esta información, pueden contener un tipo de archivo XMP  (con la misma estructura que un XML).

A continuación voy a poner un módulo que sirve para leer y grabar coordenadas GPS en imágenes y utiliza GDI Plus, este sólo es compatible con EXIF, no con XMP (el cual leerlo no seria el problema, sino guardarlo). El proyecto de descarga contiene un ejemplo con un mapa (google maps) en cual va interactuando con el código de VB, algo básico pero sirve para mostrar y cambiar las coordenadas.

Editado: 09/03/2013 – Se implemento un cuadro de búsqueda para facilitar, la localización en el mapa, el resultado sera el mas próximo, la función esta dentro del código de vb, pero podría hacerse dentro del webbrowser y listar todos los resultados referentes al criterio de búsqueda (para mas información buscar en la ayuda de las apis de gmaps.)

ImageGPS

Coordenadas GPS en fotos

Nov 052012
 

Otras de menú, ClsCustomMenu es un módulo clase que permite personalizar los items del menú, el otro día alguien preguntó en el foro como podía cambiar la fuente del menú y si bien el HookMenu puede personalizar el menú a gusto,  no tiene la opción de personalizar el ítem, así que hice esta pequeña clase para poder cambiarle algunos aspectos. En lo personal no es de mi agrado modificar la fuente del menú, pero hay casos específicos donde se tiene la necesidad. Traté de hacer algo que pueda satisfacer la necesidad de muchos, pero lo personalizado es personalizado, así que seguramente alguien querrá algo más.
Esta clase permite cambiar el Color de fuente, color de fondo, fuente, alineación, icono, tamaño.
Su funcionamiento es algo parecido al ClsMenuImage, junto a la clase hay cuatro formularios de ejemplo de su uso, cualquier duda pueden preguntar.

Desventajas: Al personalizar el menú, éste pierde el estilo de windows, esto se aprecia más que nada en (Windows Vista y Windows Seven), si se cambia el Caption del item hay que volver a llamar a la función que le aplica el estilo.

Custom Menu.