admin

May 042020
 

En este caso se trata de otra Api de Google con la que podes hacer gráficos interactivos de distintos tipos, cuando digo interactivos sólo me refiero a que tienen un pequeño efecto al pasar el mouse sobre los distintos trazos del gráfico. Si bien esto está pensado más para páginas web, puede sernos útil en casos puntuales, en ese punto cada quien decide si le es para suyo. El usercontrol internamente crea un WebBrowser para invocar a esta Api. Cuenta con soporte para DPI. De más está decir que requiere internet para cargar el gráfico; también aclaro que como yo lo propuse no está pensado para cambiar los datos en tiempo real, es decir se carga el gráfico con los datos y no se puede modificar sus rangos, para ello es necesario volverlo a cargar todo. Les recomiendo descargarlo y echarle un vistazo a cómo funciona.

Requerimientos:
– Internet Explorer 11
– Conosimiento del API de Google Charts

GoogleCharts1.png
GoogleCharts2.png
GoogleCharts3.png

 Posted by at 0:03
Abr 292020
 

Esta es una versión de este control el cual carecía de la barra de progreso para mostrar un porcentaje era más bien de esos que sólo giran. En esta versión se puede hacer ambas cosas, pero está más abocada a mostrar el progreso, prácticamente con un poco de ingenio se pueden lograr todos los diseños que se ven por la web de este tipo de controles tal como se muestra en la primer imágen; la segunda imágen es la página de propiedades del usercontrol, este sirve sólo para formar una paleta degradada de colores, donde podemos seleccionar y armar nuestra paleta a gusto. el control cuenta con muchas propiedades por lo que es necesario que metan mano y jueguen con éste para aprender para qué sirve cada una, yo no tengo ganas de hacer un archivo de ayuda :), pero mirando los ejemplos es fácil darse cuenta para qué sirve cada una.

ucProgressCircular2020.png
ucProgressCircular2020.png
Mar 172020
 

Hola, se trata de un módulo clase que sirve para automatizar whatsApp por medio del Navegador MS Edge + Javascript y VB6 a travez de web.whatsapp.com , no sé si es el caso pero creo que se puede llamar web scraping, este tipo de técnica no suelen durar mucho ya que si WhatsApp cambia parte del contenido html de su web este módulo puede quedar inservible, es para disfrutarlo mientras dure, luego si hay cambios tendrás que buscar la manera de actualizarlo.

Esto puede ser muy útil si se sabe aprovechar, podemos leer y
enviar mensajes de texto, obtener lista de contactos, números telefónicos, foto de perfil y otras.

Es importante aclarar que este módulo requiere Windows 10 y MS Edge (html version) aclaro de html version ya que en estos días Microsoft ha actualizado MS Edge a una versión que utiliza el motor de Chromium, y este no se puede automatizar, la versión clásica de MS Edge utilizaba el motor de Internet Explorer, por eso es que se puede automatizar, el motivo de utilizar Edge y no Internet Explorer es porque éste último no es aceptado por Web.Whatsapp.com, la versión de Chromium aún no es una actualizacion global de windows pero seguramente con el tiempo sea global, no se preocupen se puede volver a la versión html , siguiendo estos pasos como ven pueden tener ambas versiones si así lo desean. ACLARO NO REQUIERE SELENIUM

En la descarga se incluye el módulo y un pequeño ejemplo de uso (recalco es sólo un ejemplo no tiene utilidad alguna), a modo de comentario he realizado un aplicativo utilizando este módulo que sirve para solicitar turnos mediante whatsapp, aún no sé si lo voy a publicar, este funciona mediantes comandos de palabras, algo así como una inteligencia artificial pero de muy muy bajo nivel 🙂 en donde el cliente solicita un turno, la aplicación verifica si está disponible, lo almacena en una base de datos y le envía un mensaje que su turno ha sido reservado.

Para el ejemplo he utilizado un OCX, deben registrarlo (con permisos de administrador); utilice el ocx porque como muchos nombres y palabras utilizan caracteres unicodes lo que incluye los Emojis, si utilizan los controles comunes de vb estos se verían mal e inclusive no funcionaria bien la aplicación.

WhatsApp.png

 Posted by at 18:37
Feb 142020
 

Antes que nada quiero aclarar que este control está basado el proyecto Firenze Label, adaptado a GDI+ con muchos agregados ya que el anterior depende de vbRichClient5.
Tienen muchas propiedades y eventos que más adelante voy a ir detallando, por el momento voy a subir el control con unos cuantos ejemplos y otros controles que acompañan.
Se pueden lograr cosas muy lindas con este control, sólo es cuestion de ir jugando con sus propiedades, se puede crear muchos controles a partir de este label es cuestión de poner un poco de imaginación. Aclaro que no actúa como un control programado, es un label no un botón por lo que está en el desarrollador dar la forma en que se repinta el label cuando se dispara el mouse Down y Up y demás eventos.

Algunas capturas de lo que se puede lograr con el LabePlus LabelPlus.png

LabelPlus.png

LabelPlus.png

LabelPlus.png

LabelPlus.png

DESCARGAR VERSIÓN 1.5.2

 Posted by at 13:25
Sep 102018
 

Este proyecto se lo robe a mi amigo Coco y le hice un par de cambios que quede todo dentro del mismo UC, se trata de un user control para hacer una paleta de colores tal como muestra la imagen, este carga es una imagen png (de una paleta de colores), que puede ser leída desde disco o archivo de recurso  (no lo carga en modo de diseño por ahorrar una ventana de propiedades.) al hacer clic en la paleta lanza un evento del color seleccionado, también cuenta con un evento que muestra el color donde pasa el cursor.

ucPalette.png

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