OK I got it.
I put PreTranslateMessage in the application class, and found it was getting hammered with WM_TIMER messages from the application toolbar (an CMFCToolbar).
I had a quick look in afxtoolbar.cpp and indeed there are timers set and killed in OnMouseMove (probably something about highlighting the button while the pointer is over it).
The timer ID is defined in afxtoolbar.cpp as AFX_ACCELERATOR_NOTIFY_EVENT = 20, which is the same as what I was getting in PreTranslateMessage as the lParam.
I didn't really want to muck about with the toolbar class but a quick Google of AFX_ACCELERATOR_NOTIFY_EVENT pointed me to this article:
http://connect.microsoft.com/VisualStudio/feedback/details/529735/mfc-feature-pack-cmfcmenubar-issue[
^]
In there is a workaround which seems to work for me. I won't paste it here in case something changes at their end, but the link should get you there if you want to read about it.
Thanks very much everyone who made suggestions.