Finally cracked this with a lot of help from a friend (thanks Chris Gregan!). After many failed attempts, the answer was relatively simple. I used JNA and Windows API to create a hook for low-level mouse events. It's all described with 2 sample classes given here in an answer by 'prunge'. Note: I had to include the jars for jna version 3.4.0 and jna platform version 3.4.0 (newer versions of these jars resulted in errors!).
Using the above linked MouseHook, you can prevent a low-level event from propagating (reaching other applications) by returning -1 from the LowLevelMouseProc callback.
Here is a snippet I added to the callback method in MouseHook to intercept/suppress left mouse button presses (thereby preventing context menus from disappearing!):
if(nCode >= 0 && wParam.intValue() == WinUserX.WM_LBUTTONDOWN)
return new LRESULT(-1);
Thanks again to Alex Barker for taking the time to look at this and point me in the direction of JNA and Windows API.