Microsoft

Give your Microsoft Ergonomic Keyboard 4000 Previous/Next song functionality

This post shows how to “hack” your Microsoft Ergonomic Keyboard 4000 to give Previous/Next functionality to the numeric “Favorite” keys (specifically the 4 and 5 numbers) although you can probably use this to set Previous/Next to any of the custom keys.

These will not be application-specific but system wide, which is the beauty of it. You don’t have to switch to your music player application in order to change the track. So far I’ve tried it with Spotify and iTunes, and it works.

Here are some things that are useful to know when you do this:

  1. The Microsoft Mouse and Keyboard center uses the registry to store/retrieve the assigned target program or commands to each of the special keys. The path on the registry is at HKEY_CURRENT_USER\Software\Microsoft\IntelliType Pro\ModelSpecific\1016\EventMapping.
  2. Given that the registry is used, it is possible that for 64 bit installs there are duplicate entries on the usual SOFTWARE path and on the Wow6432 node. I bumped into that the first time I tried this. The tutorial that showed me how to do it was only for a 32 bit Windows install, so I didn’t know I had to look for the 64 bit entry at that time. This second time I did it, I’m on a Windows 8 x64, and I didn’t have to anything else other than to edit the default registry path. When I did this on Windows 7, I did have to alter the entries on the Wow6432 node.
  3. Each key has a corresponding registry Key/folder, and inside, a REG_DWORD (32 bit) entry has the actual command to execute for that key.

So, the actual steps to do this:

  1. Open the Microsoft Mouse and Keyboard Center.
  2. Go and assign custom targets for the keys that you want to you use for Prev / Next. I use #4 for Prev, so I set #4 to prev1.exe (the file does not have to exist, just makes it easier to find the key you need to edit on the registry) and I set #5 to next1.exe.
  3. Open Task Manager and kill the itype.exe process.
  4. Open the Registry, with Administrator privileges.
  5. Edit -> Find -> prev1.exe
  6. Just one registry entry should be found. Inside there will be about 4 or 5 entries. Delete all of those, it will not let you delete the default one.
  7. In that spot, create a new DWORD (32 bit) Value, make sure Hexadecimal is selected on the radiobutton, and paste the following text to its value: 000002c0. Rename the entry to “Command” (without the quotes) or it will not work.
  8. Now do the search for next1.exe, and repeat the procedure but assigning the new entry the value of 000002bf.
  9. Manually start itype.exe (location of default install is at C:\Program Files\Microsoft Mouse and Keyboard Center\itype.exe).

You should now have Previous/Next functionality on the keys that you selected. Hope it works.

Thanks to Tom from ElectroLab Games, which is where I saw the original tutorial: Microsoft Ergonomic Keyboard 4000 + Play Next Song Hack

Como borrar entradas individuales del historial de formas AutoComplete de Internet Explorer

Un tip muy sencillo pero no tan obvio..

Si acaso tienen que utilizar Internet Explorer para acceder a algun sitio, y por algun error se grabo un usuario incompleto o incorrecto en la seccion de Auto Complete, al momento de teclear el usuario en otras ocasiones, el texto del usuario incorrecto (o incompleto) sigue apareciendo como opcion para autocompletar, lo cual puede resultar ser muy molesto. Un ejemplo visual es el siguiente:

El usuario correcto es gabrielrdz, pero en alguna ocasion teclee “ga” y probablemente hice click en Enter por error, causando que se grabara “ga” como una entrada de AutoComplete.

Al estar acostumbrado a Chrome o Firefox, donde se pueden borrar o editar cada entrada de autocomplete individualmente, fui a las opciones de Internet Explorer para borrar el usuario incompleto, pero no habia opcion para ver/editar entradas individuales, solo para borrar completamente toda la informacion de AutoComplete.

Para borrar una entrada incorrecta de Internet Explorer AutoComplete, lo unico que hay que hacer, es hacer que se muestre la lista de autocomplete que deseamos editar, tener seleccionada la entrada que queremos borrar, y hacer click en la tecla de Delete.

Espero les sirva.

Como eliminar la excepcion ThreadAbortException al navegar entre paginas en ASP.NET

Llevo casi 10 años trabajando con ASP.NET y me sorprendi al aprender que cada vez que se ejecuta el comando Response.Redirect(url) en ASP.NET (para navegar hacia otra pagina), el framework lanza intencionalmente una excepcion de tipo ThreadAbortException, con el unico objetivo de terminar absolutamente la ejecucion del request actual.

Como mencione, esto es intencional por parte del framework, y el articulo “Correct use of System.Web.HttpResponse.Redirect” de Thomas Marquardt explica las razones de este diseño.

Para observar esto, solo se necesita correr una aplicacion de ASP.NET en Debug Mode, y ejecutar una linea de Response.Redirect(“Default.aspx”), y observar la ventana de Output en Visual Studio; se vera lo siguiente:

A first chance exception of type ‘System.Threading.ThreadAbortException’ occurred in mscorlib.dll

An exception of type ‘System.Threading.ThreadAbortException’ occurred in mscorlib.dll but was not handled in user code 

Como la mayoria de los desarrolladores debe saber, esto es un problema porque uno de los principales lineamientos de performance en .NET es “No utilizar Exceptions para controlar el flujo de la aplicacion“. Si esto sucede en una aplicacion web con mucho trafico, el lanzar exceptions cada vez que un usuario navega de una pagina a otra, eventualmente va a afectar el desempeño de la aplicacion.

En fin, la solucion para esto es sencilla, pero hay un detalle importante que hay que tomar en cuenta. Como el articulo de Thomas M. indica, se debe de utilizar el siguiente codigo:

Response.Redirect("Target.aspx", false);

HttpContext.Current.ApplicationInstance.CompleteRequest();

Es decir, utilizamos el overload de Response.Redirect pasando false al parametro de endResponse(para evitar que el .NET framework haga la llamada interna a Response.End(), y al final indicamos que deseamos completar/finalizar el request.

El detalle importante que hay que considerar si deseamos utilizar esta manera de redireccionar para evitar la excepcion es que antes, la llamada interna a Response.End() hacia que cualquier codigo que estuviera despues de la llamada original a Response.Redirect() ya no se ejecute, y esto es algo a lo que inconscientemente muchos desarrolladores nos acostumbramos. No es nada raro ver codigo de este tipo en aplicaciones de ASP.NET:


if (!User.HasAccess()) Response.Redirect("GetOut.aspx");

SinceUserHasAccessDoThis();

Si lo hacemos de la manera nueva, pasando el overload con false, cualquier codigo en el metodo que este despues del Response.Redirect si se ejecutara.

Esto es porque era la llamada interna a Response.End() (que ahora estamos evitando) que terminaba la ejecucion del codigo. Como ahora estamos evitando esa llamada, la funcion SinceUserHasAccessDoThis() si se ejecutaria, a pesar de que el usuario no tuviera el acceso que se verifica en el metodo HasAccess().

Aparte de lograr evitar esas excepciones, aprendi que tambien es incorrecto utilizar Response.Redirect para controlar el flujo de la aplicacion, y al menos yo lo hacia inconscientemente. Si se desea evitar esas Exceptions y no se tiene el tiempo para hacer un refactor del codigo para estructurarlo correctamente, se puede arreglar utilizando un return; despues del Response.Redirect, de esta manera:


if (!User.HasAccess())
{
    Response.Redirect("GetOut.aspx", false);
    HttpContext.Current.ApplicationInstance.CompleteRequest();
    return;
}

SinceUserHasAccessDoThis();

Paginas de referencia

  1. Response.Redirect causes System.Threading.ThreadAbortException
  2. Correct use of System.Web.HttpResponse.Redirect
  3. Microsoft Support: PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer
  4. HttpApplication.CompleteRequest Method
  5. Is Response.End() considered harmful?
  6. Rick Strahl – Ending a Response without Response.End() Exceptions?

Espero les sirva.

1 2  Scroll to top