c# WM_TOUCH WndProc 和 PreFilterMessage 中的消息
本文关键字:PreFilterMessage 消息 WndProc WM TOUCH | 更新日期: 2023-09-27 18:33:37
我正在尝试使用WM_TOUCH消息来捕获应用程序中的触摸事件。例如,我想注册一个"3 手指滑动"手势,因为WM_GESTURE中没有给出这个手势,所以我开始尝试WM_TOUCH。我发现这个例子 http://msdn.microsoft.com/en-us/library/windows/desktop/dd940546%28v=vs.85%29.aspx 该示例的问题在于,他们使用仅适用于单个表单的 WndProc。我想在整个应用程序中捕获触摸,所以我尝试使用PreFilterMessage而不是WndProc。
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public bool PreFilterMessage(ref Message m)
{
// Decode and handle WM_TOUCH message.
bool handled;
switch (m.Msg)
{
case WM_TOUCH:
Debug.WriteLine("PreFilter TOUCH: " + m.ToString());
handled = DecodeTouch(ref m);
break;
case 0x201:
Debug.WriteLine("PreFilter LEFTMOUSEDOWN: " + m.ToString());
handled = false;
break;
default:
handled = false;
break;
}
...
现在的问题是,PreFilterMessage
LParam
与WndProc
中的LParam
不同,这在我尝试调用GetTouchInputInfo
时会导致问题。这是我的调试日志:
PreFilter TOUCH: msg=0x240 hwnd=0x530598 wparam=0x1 lparam=0x3ff0573 result=0x0
WndProc TOUCH: msg=0x240 hwnd=0x530598 wparam=0x1 lparam=0xf170000 result=0x0
PreFilter LEFTMOUSEDOWN: msg=0x201 (WM_LBUTTONDOWN) hwnd=0x530598 wparam=0x1 lparam=0x14100c1 result=0x0
WndProc LEFTMOUSEDOWN: msg=0x201 (WM_LBUTTONDOWN) hwnd=0x530598 wparam=0x1 lparam=0x14100c1 result=0x0
为什么鼠标输入的LParam
相同,而触摸输入的不同?如何在预过滤消息中转换 LParam,以便我可以调用GetTouchInputInfo
?
我最终使用了不同的方法,因为我无法让它工作。我使用透明表单作为叠加层(像这样)来获取正确的消息。这样我就得到了正确的LParam。如果需要,我还可以通过使用带有修改后的 hWnd 的CallWindowProc
将消息转发到叠加层下方的窗口。