Xwork's Blog

The lord is waiting to take your hand.

Mostrando las entradas con la etiqueta keyremap. Mostrar todas las entradas
Mostrando las entradas con la etiqueta keyremap. Mostrar todas las entradas

Vamos a programar #88 - KeyRemap M (beta)

Hola de nuevo a todos, el día de hoy vamos a ver cómo es que funciona un programa al que decidí llamar "KeyRemap M" (en su versión beta).


Cómo el programa aun está en modo beta, solo voy a explicar un poco su funcionamiento y ya que mucho del código va a cambiar, en cuanto libere la versión 1 explicare cada una de las partes del código (y también liberare el código fuente).

Para empezar, debes de descargar el programa (cómo es costumbre de mi dropbox). Y la forma de usarlo es realmente simple. Para empezar debemos de hacer clic en la caja de texto que dice "tecla a re-programar", cuando presionemos una tecla, aparecerá un número y lo debemos de dejar tal y cómo está (si presionas otra tecla, aparecerá un código diferente). Para la tecla de destino, podemos hacer dos cosas, la primera: revisar esta tabla que contiene algunos códigos o en el mismo programa vienen algunos.



Si queremos averiguar cual es el código de una de las teclas por ejemplo la tecla "e", puedes presionar la tecla cuando el la caja de texto "tecla a re-programar" está seleccionada y el código que resulte lo copias y lo pegas en la caja siguiente una vez hecho, vuelves a la caja de texto "tecla a re-programar"y presionas la tecla que quieres re-programar. Cuando hayas configurado las teclas que quires reasignar, debes de hacer clic en el botón que dice "Agregar" y con eso la combinación de teclas se agregará a la lista.


Cuando hayas agregado todas las combinaciones de teclas, en el menú "archivo" deberás de hacer clic en "Exportar REG" y se abrirá un cuadro de dialogo para guardar el archivo. Guarda el archivo y dale doble clic


Con eso se agregará la información al registro; solo para ver si se agrego de forma correcta, presiona la tecla de windows  + r y en el cuadro "ejecutar" escribe "Regedit"

y busca la ruta "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]"

Tras reiniciar la computadora, la teclas debería de hacer su nueva función. Pero antes, he de aclarar que algunos códigos no funcionaran dependido de la configuración de algunos programas, por ejemplo; muchos juegos ignoran la configuración de windows y manejan por si mismos las pulsaciones. En otros casos, algunas teclas especiales no se pueden re-configurar y el ejemplo mas claro de ello es la tecla "Pausa-Inter" esta no es posible re asignarla usando este método (aunque muchos teclados ya ni la tienen).

Si todo salio bien, para re-establecer las teclas a su función normal, bastara con eliminar la clave "scancode map" del registro y reiniciar la computadora.


Y bien por ahora es todo. Cómo podrás ver, la aplicación aun no es fácil de usar, pero por eso es una versión beta, en el siguiente post trataremos de hacerla mas amigable con el usuario para que cualquiera sea capaz de usarla sin problema.

Los leo luego

Vamos a programar #87 - Camino a KeyRemap, MessageTextBox .

Hola de nuevo a todos, el día de hoy vamos a empezar un programa que nos sirva para re- configurar las teclas de nuestro teclado.


En el post anterior vimos que es posible re-asignar algunas teclas, todo bien si conocemos cual es el código de la tecla que queremos cambiar (tanto la actual cómo la objetivo) pero actualmente existen teclados que tienen tantas teclas que no están dentro del estandar, que resulta difícil determinar el código buscando en Internet.

En este post veremos cómo es posible determinar el código de cada tecla usando un programa que escribiremos en C# (Si no te interesa, en el siguiente post veremos la versión final de este programa lista para usarse).

Para empezar, primero hay que saber cómo es que se "crean" las pulsaciones. En C# (y probablemente en windows) cuando presionamos una tecla, ocurren los siguientes tres:
  1. KeyDown
  2. KeyPress
  3. KeyUp
KeyDown es el momento en que presionamos la tecla, KeyPress ocurre el tiempo que mantenemos la tecla (usualmente una fracción de segundo pero cuenta aun) y KeyUp que es cuando soltamos la tecla. Windows envía un mensaje diciendo: "Se presiono la tecla con el código XXXX, ahora se mantiene la tecla con el código XXXX y se acaba de soltar la tecla con el código XXXX", cómo son mensajes del sistema operativo, es posible leerlos desde C#, para eso disponemos de dos formas. La primera de ellas es usando lo eventos "_KeyDown", "_KeyPress" y "_KeyUp", muchos de los controles que se pueden añadir a c# disponen de ellos, pero es mas común usarlos en controles "TextBox". Cuando se crea el procedimiento que maneja el evento, se usan dos parámetros, el primero del tipo "object" llamado "sender" y el segundo del tipo "KeyEventArgs" llamado "e"; en este, hay varios procedimientos que nos podrían ser de utilidad, uno de ellos llamado "KeyCode".

Supongamos que tenemos un control "ComboBox" llamado "MsCboKeyOut" al crear el manejador para el evento tendríamos algo cómo lo que sigue:
		private void MsCboKeyOut_KeyDown(object sender, KeyEventArgs e)
		{
			MessageBox.Show(e.KeyCode.ToString());
			e.SuppressKeyPress = true;
		}


Si accedemos al procedimiento "KeyCode" y presionamos la tecla de silencio (mute), esta nos devolverá un valor de 173. Si hacemos memoria, en el post anterior vimos que el código de esa tecla era E020 hexadecimal o 57376 decimal que dista mucho de lo que nos entrego. Incluso haciendo pruebas con varias teclas, el valor maximo que obtuve fue 255 decimal (FF hexadecimal) por lo que si queremos usar este procedimiento para saber el código de las teclas "no normales" simplemente no nos sera posible.

La manera correcta de  de saber el valor real de la tecla, es leyendo directamente el mensaje  lo lleva. En C#, podemos sobrecargar el procedimiento "WndProc" que básicamente sirve para leer los mensajes. Pero cómo queremos ser capaces de utilizar el valor cuando el formulario tiene el foco (que es lo mas común), crearemos un control sencillo con la sobrecarga para que asi podamos utilizarlo.


using System;
using System.Windows.Forms;

namespace KeyRemap
{
	class MessageTextBox : TextBox
	{
		public const int WM_KEYDOWN = 0x0100;
		private uint TheValue = 0;

		public string GetHexValue
		{
			get
			{
				return Convert.ToString(TheValue, toBase: 16);
			}
		}
		public uint ShowKeyCode(uint TheNumber)
		{
			uint KeyValue = TheNumber;
			uint KeyCode = ((KeyValue >> 16) % 256);
			uint IsExtendedKey = ((KeyValue >> 24) % 2);
			if (IsExtendedKey == 1)
			{
				KeyCode = FrmMain.EXTENDED_KEY_VALUE | KeyCode;
				return KeyCode;
			}
			else
				return KeyCode;
		}

		[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
		protected override void WndProc(ref Message m)
		{
			switch (m.Msg)
			{
				case WM_KEYDOWN:
					base.Text = "";
					base.Text = Convert.ToString(ShowKeyCode((uint)m.LParam));
					TheValue = (uint)m.LParam;
					break;
			}
			base.WndProc(ref m);
		}
	}
}



Con este control será mas sencillo interceptar el mensaje que contiene el código de la tecla. Para usarlo, simplemente agrega una nueva clase a tu proyecto y  el evento "_KeyDown" del parámetro "e" , la propiedad "SuppressKeyPress" se debe de establecer el valor de "true" para que el texto que se escriba en el cuadro de texto, corresponda solamente al código de la tecla, si no se suprime la pulsación, si por ejemplo presionamos la tecla "u", en la caja de texto diría "uxx" (donde xx es el código de la tecla u).

Por ahora solo veremos esto y cómo aun falta implementar mucho código, la explicacion detallada vendrá en el siguiente post (junto con la versión ultra beta de "KeyRemap M"), por ahora si sabes programar en C# puede probar el control (y si algo anda mal me pueden avisar).

Los leo luego.

Vamos a programar #86 - Reasignando teclas del teclado.

Hola de nuevo a todos, el día de hoy vamos a ver cómo reasignar algunas botones de nuestro teclado para que hagan otra cosa.

Hace unos días en la eterna lucha del hombre contra la máquina, mi teclado simplemente decidió que 15 años de uso eran suficientes y simplemente ya no quiso funcionar. Mi teclado compaq 5185 fue el primero que tuve y lo use de forma bastante extenuante.
Algo paso que simplemente ya no quiso reconocer las pulsaciones. Cómo siempre que "reparo" algo hay una enorme tendencia a que me "sobren" piezas, simplemente decidí guardarlo. Para su reemplazo, saque un teclado que un amigo me regaló hace mucho (cómo el de la primer imagen), es más compacto y mas viejo que el mio pero totalmente funcional salvo por unos cuantos botones.

Mi primer teclado tenía la ventaja que tenia varios botones adicionales; los mas importantes (para mi) eran: volumen arriba, volumen abajo, silencio y calculadora. El reemplazo también tiene unos botones extra (seis para ser exacto), pero al conectarlo y presionarlos, ninguna hizo nada. Busqué los controladores pero no encontré ninguno para mi sistema operativo. Las teclas "normales" funcionan cómo deben, pero las "especiales" no.

Para solucionar mi problema busque en internet y encontré que todas las pulsaciones del teclado son gestionadas por el sistema operativo, es decir, si presionamos una tecla, está genera un código pero nuestro amigo Windows es el responsable de que pasa después y no solo eso, posee la capacidad de reasignar las pulsaciones.

Tomando en cuenta lo anterior, vamos a buscar una forma de re-asignar una tecla, pero hay una advertencia, vamos a modificar el registro de Windows (el registro prácticamente es un lugar donde se guardan las configuraciones de una computadora con ese sistema operativo), si sigues los pasos que voy a mostrar no habrá ningún problema, pero si mueves más "cosillas" puedes hacer que el PC no inicie correctamente.

Antes que nada veamos unos cuantos códigos para algunas teclas.

   
US   key assignment   
   
Base   Make   
   
Insert   
   
E0   52   
   
Delete   
   
E0   53   
   
Left   Arrow   
   
E0   4B   
   
Home   
   
E0   47   
   
End   
   
E0   4F   
   
Up   Arrow   
   
E0   48   
   
Dn   Arrow   
   
E0   50   
   
Page   Up   
   
E0   49   
   
Page   Down   
   
E0   51   
   
Right   Arrow   
   
E0   4D   

Para nuestra demostración vamos a usar la tecla "Page Up" y la vamos a reasignar para silenciar el volumen del sistema. La siguiente tabla muestra  algunos de los códigos de teclas multimedia.

CODEALIAS
E0 6AVK_BROWSER_BACK
E0 69VK_BROWSER_FORWARD
E0 67VK_BROWSER_REFRESH
E0 68VK_BROWSER_STOP
E0 65VK_BROWSER_SEARCH
E0 66VK_BROWSER_FAVORITES
E0 32VK_BROWSER_HOME
E0 20VK_VOLUME_MUTE
E0 2EVK_VOLUME_DOWN
E0 30VK_VOLUME_UP
E0 19VK_MEDIA_NEXT_TRACK
E0 10VK_MEDIA_PREV_TRACK
E0 24VK_MEDIA_STOP
E0 22VK_MEDIA_PLAY_PAUSE
E0 6CVK_LAUNCH_MAIL
E0 6DVK_LAUNCH_MEDIA_SELECT
E0 6BVK_LAUNCH_APP1
E0 21VK_LAUNCH_APP2

El código de la tecla que queremos usar es "E0 20" y el código de la tecla "Page UP" es "E0 49" pero ¿y después? Cómo ya mencione antes, Windows es el encargado de gestionar las pulsaciones y guarda esta configuración en el registro. Para acceder a ella, necesitamos encontrar la siguiente clave:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]

Ahí crearemos un nuevo valor binario.


La estructura que debe de tener el valor es de la siguiente forma:

  • 00,00,00,00 > encabezado
  • 00,00,00,00 > flags
  • 02,00,00,00 > número de entradas más uno
  • xx,xx,xx,xx > el código de las teclas a reasignar empezando por el código que queremos que se aplique seguido por el código de la tecla
  • 00,00,00,00 > terminación.
Entonces si sustituimos los valores de nuestras teclas, tenemos algo cómo de la imagen:


Hay que notar que cada código tiene los valores "invertidos", es decir, la tecla de silencio tiene el código "E0 20" pero al momento de escribir el valor en el registro, lo ponemos cómo "20 E0" y lo mismo va para todas las teclas, la tecla "Page Up" tiene el codigo "E0 49" pero lo escribimos cómo "49 E0". Al reiniciar la computadora y presionamos la tecla "Page Up", el sistema se debería de silenciar (en caso contrario algo salio mal). Si quieres hacer el proceso de forma automática, puedes copiar el siguiente texto y guardarlo cómo "key.reg" usando el bloc de notas.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,20,E0,49,E0,00,00,00,00

Cada vez que hagas un cambio se debe de reiniciar la computadora.
Finalmente y a manera de ejemplo, supongamos que queremos cambiar las teclas que ya cambiamos, pero ademas queremos que la tecla numérica 7 suba el volumen, tendríamos algo cómo lo que sigue:

  • 00,00,00,00 > encabezado
  • 00,00,00,00 > flags
  • 03,00,00,00 > número de entradas más uno
  • 20,e0,49,e0 > el código del primer juego de teclas
  • 30,e0,47,00 > el código del segundo juego de teclas
  • 00,00,00,00 > terminación.
Cómo podrás ver, hay una gama amplia de posibilidades, solo ten en cuenta que los cambios son solo validos para teclas simples, si intentas crear combinaciones de teclas (ctrl + shift +supr) estas no funcionaran. En el siguiente post continuaremos con mas de esto y aprenderemos a detectar cuales son los códigos de cualquiera de las teclas de nuestro teclado.

Los leo luego.