Have found a solution as per Gustavo Cavalcanti's answer to a similar question. The application is now catching the individual key press events, and I am able to determine keyboard state and act accordingly when the arrow keys are pressed (via checks on LWin/RWin and arrows with Keyboard.IsKeyDown).
This is an alright solution for now but it doesn't quite match Windows' normal functionality as windows are expected to move/dock in the instant that the user presses the arrow key rather than when it is released.
All the same, better than nothing and works out of the box with minimal extra code and no other dependencies/libraries. Superior solutions are still welcome, and I won't be marking this answer as a solution as the problem hasn't been solved comprehensively.