I have since discovered the following sequence:
1) User clicks on the C# user control
2) The WndProc method is called on the C# user control
3) The method finishes ok, and execution returns to the legacy C++ app
4) This hangs in the main message loop, on the next call to IsDialogMessage, which gets stuck in an infinite loop (CPU goes to max)
Please help! This is a key part of my future design, and I can't go further until I know it works.