You could write a little app that sets a keyboard hook (WH_KEYBOARD_LL) and when the substitute key is pressed, do a PostMessage w/ WM_KEYUP or whatever. You'd have to give up another key for it though, or use alt+the other key.
Like sna suggested different windows releases may have built in support for mapping keys but I've never used any of them.
At work awhile back I had one of those new fangled internet keyboards with an extra row of buttons that launched IE, raised the volume, etc. There wasn't any built in support for changing the function of the keys though so I coded a little keyboard hook dll and app. Everything was hardcoded. I did intend to add an i/f to change the function of the keys but I never got around to it because I hardcoded everything that I needed into it. If you'd like it I'll find the source and upload it. It wouldn't be too hard to add the code to 'train' it, storing the keydata in some external config file or something.