Unknown's avatar

About hvivani

Systems Engineer, Developer, Technical Leader, IT Manager

Captura Teclas / Keylogger en C# independiente del foco de la aplicación


Este es un capturador de teclas independiente de si la aplicación tiene el foco o no. Trabaja en modo consola, pero puede adaptarse a diversas necesidades.

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace atrapateclas
{
    class Program
    {
        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_SYSKEYDOWN = 0x0104;
        private static LowLevelKeyboardProc _proc = HookCallback;
        private static IntPtr _hookID = IntPtr.Zero;

        static void Main(string[] args)
        {
            _hookID = SetHook(_proc);
            Application.Run();
            UnhookWindowsHookEx(_hookID);
        }

        private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }

        private delegate IntPtr LowLevelKeyboardProc(
            int nCode, IntPtr wParam, IntPtr lParam);

        private static IntPtr HookCallback(
            int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN))
            //if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);
                //if (Keys.C == (Keys)vkCode && Keys.Control == Control.ModifierKeys)
                //verifico que se presione CTRL + F1:
                if (Keys.F1 == (Keys)vkCode && Keys.Control == Control.ModifierKeys)
                    Console.WriteLine((Keys)vkCode);
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook,
            LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
            IntPtr wParam, IntPtr lParam);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
    }
}

 

Cableado Estructurado: Cable Directo – Cable Cruzado


En cableado estructurado tenemos dos normas fundamentales a utilizar con los conectores RJ45.

Estas son la T568A y T568B. Estas nos permiten armar cables directos (PC a swith o hub) o cruzados (pc a pc).

El cable cruzado, cruza los terminales de transmisión de un lado (T568A) para que lleguen a los terminales de recepción del otro extremo (T568B). Es decir, un extremo va con T568A y el otro extremo con T568B.

El cable directo, tiene ambos extremos con la misma norma (T568A)

 

Sql Server prevent saving on table re-creation – Error al regrabar tabla


Acá va un post recordatorio para cuando tenemos un SQL Server 2008 Management Tools, donde creamos una tabla y posteriormente queremos modificar su estructura. Seguramente, si estamos con los parámetros por defecto, no podamos grabar las modificaciones en la estructura de la tabla.

Esto se debe a un parámetro de protección configurable que previene grabar los cambios que requieren una re creación de las tablas.

Debemos deshabilitar esta opción en Tools –> Options –> Designers –>Table and Database Designers –> destildar Prevent Saving changes that requires table re-creation.

 

Fedora en Virtual Box: Kernel Panic


Si están instalando un Linux Fedora x86 (ej. Fedora 7 ) sobre una máquina virtual con VirtualBox con arquitectura de 64 bits, es muy probable que obtengan el siguiente mensaje al booteo de la instalación:

"Kernel panic - not syncing: Attempted to kill init!"

Ante está situación, lo que tenemos que hacer es habilitar en el Virtual Box, la opción Sistema –> IO APIC.

 

Liberando código fuente: Descarga de padrones ARBA


Esta es mi primera liberación de código fuente, y pensando en que código liberar, me puse a revisar y encontré algo exótico. Algo que muchas empresas utilizan bastante hoy en día y que si solicitan su desarrollo, seguramente resulte bastante caro…

Así es que aquí está la disponible para todo el mundo el código fuente del algoritmo de comunicación con los servidores de ARBA para la descarga de padrones de recaudación por sujeto.

Este es el link: https://code.google.com/p/gestion-arba/ y está bajo licencia GNU GPL v3

Espero que esto anime a mas desarrolladores a liberar código fuente que sea útil para mejorar la productividad.

 

Control de Acceso del Personal con Linux


Alguna vez se encontraron en la situación en la que deben implementar algún sistema de control de acceso del personal, es decir, registrar horarios de entrada y salida del personal, pero no tienen accesorios o software específico para realizar esta tarea ?

Una solución para estas situaciones es muy simple: utilizar el sistema linux donde trabaja el usuario, registrando los horarios de logueo – deslogueo del sistema. Es decir, sus entradas / salidas, son los logueos / deslogueos de su  sistema linux.

Como verificamos después el registro de entradas /salidas ? con el comando last :

$ last | grep loginusuario

Obtenedremos una salida similar a la siguiente:

hvivani tty1         :0               Fri Feb 24 07:07 - 15:15  (08:07)    
hvivani tty1         :0               Thu Feb 23 07:28 - 15:58  (08:30)    
hvivani tty1         :0               Mon Jan 30 07:13 - 16:02  (08:49)    
hvivani tty1         :0               Tue Jan 17 07:11 - 15:58  (08:46)    
hvivani tty1         :0               Tue Jan  3 07:09 - 15:58  (08:49)    
hvivani tty1         :0               Wed Dec 28 07:05 - 15:58  (08:52)    
hvivani tty1         :0               Fri Dec 23 07:11 - 14:59  (07:48)    
hvivani tty1         :0               Mon Dec 19 07:14 - 15:59  (08:44)    
hvivani tty1         :0               Wed Dec  7 07:47 - 15:55  (08:07)

Vean que podemos obtener el horario de logueo / deslogueo y el tiempo trabajado.

regsvr32 on a 64 bit platform


Resulta que tengo una aplicación desarrollada en C# para un dispositivo de lectura de huellas dactilares FP200 de Wison Tecnologies. Este dispositivo viene con una librería (DLL) COM precompilada que es necesario registrar en el sistema operativo huésped a fin de poder acceder al dispositivo.

En plataformas de 32 bits, este registro lo realizaba siempre con el viejo y no tan querido regsvr32. En las nuevas plataformas de 64 bits, no me fué tan bien.

En principio hay que aclarar: en los sistemas operativos Microsoft (w7) de 64 bits hay dos versiones del regsvr32, una en \windows\system32 y otra en \windows\sysWOM64. La de system32 es para 64 bits y la de sysWOM64 es para 32 bits.

Debemos tratar de registrar nuestra librería con la aplicación y en el directorio correcto a fin de que funcione, de otra manera tendremos grandes dolores de cabeza.

Por otro lado, habiendo registrado la librería en alguno de los dos directorios mencionados, en mi caso, tuve que recompilar los ejecutables, indicando plataforma destino “x86” en vez de “Any CPU” ó “x64”.

Ojo al abrir la ventana de DOS “cmd.exe” que debe abrirse con permisos de administrador, sinó no podremos registrar la DLL.

Espero que esto sea de utilidad a los que se encuentren con este problema.

SQL: Concatenar varios registros de una columna en una sola cadena


English Version

Es probable que tengamos varios registros pertenecientes a una columna o campo que debamos concatenar y mostrar en una sola cadena. Algo así:

descripcion
===========
valor1
valor2
valor3

y necesitamos obtener algo así:

valor1, valor2, valor3

es decir, como si tuvieramos que trasponer la columna, pero sin complicarnos.

La solución es la siguiente:

DECLARE @valores VARCHAR(1000)
SELECT @valores= COALESCE(@valores + ', ', '') + descripcion FROM carpetas
select @valores as valores

La magia la hace el comando COALESCE que devuelve la expresión que no contenga el valor NULL entre sus argumentos.

OJO: Esta solución es válida solo si ningún renglon es NULL.

SQL: How to combine multiple rows into one string


Spanish Version

The problem:

We may have several records belonging to a column or field that we want to concatenate and display in a single string. Something like this:

description
===========
value1
value2
value3

and we want to get something like this:

value1, value2, value3

that is, as if we had to transpose the column, but without complicating ourselves.

The solution is:

DECLARE @values VARCHAR(1000)
SELECT @values= COALESCE(@values + ', ', '') + description FROM folders
select @values as values

The magic is done by the COALESCE command that returns the expression that does not contain the NULL value among its arguments.

NOTE: This solution is valid only if no row is NULL.