So I happened to implement multi-touch for PPSSPP and to do that I consulted the Windows documentation which made me request touch input with RegisterTouchWindow and then handle the resulting WM_TOUCH events, the only issue is that Windows still sends the emulated WM_LBUTTONDOWN WM_MOUSEMOVE and WM_LBUTTONUP, so I needed to filter the events that came from touch to not handle them twice.
The docs recommendeded I filter with
#define MOUSEEVENTF_FROMTOUCH 0xFF515700 #define MOUSEEVENTF_MASK 0xFFFFFF00 //... //... case WM_LBUTTONDOWN: if ((GetMessageExtraInfo() & MOUSEEVENTF_MASK) != MOUSEEVENTF_FROMTOUCH) { //handle mouse events here } break; case WM_TOUCH: //handle touch here
But turns out this silently makes pen inputs disappear in a black hole as they trigger MOUSEEVENTF_FROMTOUCH but don’t generate a WM_TOUCH event. So I added the 0x80 bit to the mask which is 1 when the source is touch and 0 when the source is a pen/stylus.
#define MOUSEEVENTF_FROMTOUCH_NOPEN 0xFF515780 #define MOUSEEVENTF_MASK_PLUS_PENTOUCH 0xFFFFFF80 //... //... case WM_LBUTTONDOWN: if ((GetMessageExtraInfo() & MOUSEEVENTF_MASK_PLUS_PENTOUCH) != MOUSEEVENTF_FROMTOUCH_NOPEN) { //handle mouse events here } break; case WM_TOUCH: //handle touch here