Windows平板 区分当前是鼠标点击还是触摸

开发的程序原本的功能是支持左键单击,右键单击,鼠标悬浮功能,但是测试发现在平板上长按触摸时,会先响应右键消息,然后释放后会再触发鼠标悬浮消息,相当于一次操作触发了两个功能,用户体验也不好。

原本是想直接判断当前是否支持触摸,支持触摸就不支持悬浮功能,但是现在各种高清和办公电脑都支持触摸,直接这样处理误伤太大,最好是鼠标点击时保持原有逻辑,触摸时不响应鼠标悬浮消息


查询msdn,可知:

1.对于传统程序,对应触摸消息为WM_GESTURE,这个消息为了兼容,默认会转成传统的鼠标消息,如下:


可知,触摸长按对应传统右键消息

2.如果窗口RegisterTouchWindow注册为Touch窗口,触摸对应消息为WM_TOUCH,此时不会默认转成鼠标消息,鼠标点击和触摸响应自己分别写不同响应函数


因此,为了解决这个问题,有如下两种办法:

1.在鼠标消息中判断当前鼠标消息是从鼠标点击来的还是触摸来的

2.分别响应鼠标消息和触摸消息


第二种很明确,但是会增加明显的工作量,偷懒想用第一种,正好查到msdn文档中真的提供了区分消息来源的方法,完事大吉~

如下,注意此函数必须在鼠标响应函数中调用才有效,SendMessage/PostMessage转发后的消息中是无法判断的:

//功能:区分当前事件是由鼠标还是触摸产生的
//参考https://msdn.microsoft.com/en-us/library/windows/desktop/ms703320
#define MI_WP_SIGNATURE  0xFF515700
#define SIGNATURE_MASK	 0xFFFFFF00
inline bool IsTouchEvent() 
{
	LPARAM dw = GetMessageExtraInfo();
	return (dw & SIGNATURE_MASK) == MI_WP_SIGNATURE;
}

测试程序 下载链接,DebugView可实时查看输出

Window 触摸参考MSDN链接

原创,转载请注明来自http://blog.csdn.net/wenzhou1219

猜你喜欢

转载自blog.csdn.net/wenzhou1219/article/details/78242515