Just cleaned up the code of an old tool I wrote for my own usage and decided to open-source it.
I bought the Pepper Jobs W10 Gyro Air Smart Remote about two years ago to use with my living room HTPC. It came with a ton of shortcuts and a full-sized keyboard on the back:

I loved the remote and it pretty much eliminated the need for another mouse / keyboard in the living room. The only problem I had with it was the lack of a scrolling feature. I had to move the cursor to the side of a page and manually drag the scrollbar up and down if I wanted to scroll.
That wasn’t ideal so I wrote this little tool that hijacks the “File Explorer” (Win+E) shortcut on the remote. When the button is pressed, the mouse gets locked in place and any attempt of moving the cursor upwards / downwards will be interpreted as scrolling instead:
The key combination is hardcoded and one will need to modify the source code and recompile their own binaries if they want to reassign the feature to a different button. If you know how to do that, you can pretty much use the program with any air mouse remote.
Here is the code. Binary can be found in the release page.

hey man I just got an M5 air mouse that doesnt have scrolling either, but it also doesnt have file explorer button! im wondering how can I change this to instead of it being Win+E be another shortcut. Thanks!
Hey! Had to go re-read my own code since it’s been a while. The shortcut detection lives in KeyboardHook.cpp — right now it’s hardcoded to look for VK_LWIN (left Windows key) held down followed by E, and there are about 8 spots in that file referencing those two keys (map entries, state-machine checks, and the two simulateKeyUpEvent calls).
Easiest path: just tell me what you want it to be and I’ll update the code and send you a fresh compiled .exe. I just need to know exactly what key (or key combo) your M5 button sends. To figure that out, open any online key tester in a browser (e.g. keyboard-test.space), click into the page, then press the button on your remote — it’ll show you the key name. You can cross-reference it on Microsoft’s virtual key codes page if you want to be sure: https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
One heads up — my state machine assumes the trigger is two keys held together (a chord). If your M5 button just sends a single key (e.g. Browser Back, an F-key, a media key), it’ll need a bit more rewriting since the WaitingForEDown / BothHeld logic won’t apply — but that’s still totally doable, just let me know what it sends.
If you’d rather modify it yourself, the cleanest approach is to add two constants at the top of the anonymous namespace and find-replace everywhere:
“`
cppnamespace {
constexpr DWORD TRIGGER_KEY_1 = VK_LWIN; // change this
constexpr DWORD TRIGGER_KEY_2 = ‘E’; // and this
HHOOK hHook = nullptr;
// … rest of the code
“`
Then swap VK_LWIN → TRIGGER_KEY_1 and ‘E’ → TRIGGER_KEY_2 throughout KeyboardHook.cpp and recompile.