For some reason, I wrote "custom built hardware" in the headline but forgot to actually write about that other thing I did a couple of years ago:
I had a cheap video projector that could only be controlled using its very flimsy remote control. It had no hardware buttons for menu access and the like. Of course, the remote began acting funnily after some time and replacing the battery wouldn't do anymore. So I took an Arduino, bought an IR receiver diode and an IR LED, plugged them into the Arduino and wrote some code that could read the raw IR codes from the original remote - and send them to my laptop via USB serial. Since the remote was still working if I pressed the buttons REALLY hard, I could read all of the original IR codes. Then I wrote a Processing sketch which loaded up an image of the remote on the laptop. It had button overlays which would send the raw IR codes to the Arduino when pressed, which then would make use of the IR LED to control my projector. It worked perfectly fine until the projector broke, too.
Another thing I built was an Arduino Micro that had three buttons attached to it, which were programmed to send generic multimedia keyboard commands like Rewind, Play/Pause and Forward. With the Arduino IDE and USB descriptors back then it was impossible to send these commands with the off-the-shelf version of Arduino, so I had to download the source, change the USB descriptor and compile my own version. The original plan was to make hardware buttons for mobile phone music playback. I abandoned the project there, but if I continued, the next steps would have been: desolder the extra pins from the Arduino Micro to give it a smaller profile and construct a phone case that would place the hardware controls and Arduino Micro at the bottom of the phone.