Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WndProc中的c WM_触摸信息和预过滤信息_C#_Winforms_Interop_Wndproc_Wm Touch - Fatal编程技术网

C# WndProc中的c WM_触摸信息和预过滤信息

C# WndProc中的c WM_触摸信息和预过滤信息,c#,winforms,interop,wndproc,wm-touch,C#,Winforms,Interop,Wndproc,Wm Touch,我正在试验WM_TOUCH消息,以便在我的应用程序中捕获触摸事件。例如,我想注册一个3个手指的滑动手势,因为在WM_手势中没有给出,所以我开始尝试WM_触摸。我发现这个例子的问题是,他们使用的WndProc只适用于单个表单。我想捕捉整个应用程序中的内容,所以我尝试使用PreFilterMessage而不是WndProc [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] public bool PreFilterM

我正在试验WM_TOUCH消息,以便在我的应用程序中捕获触摸事件。例如,我想注册一个3个手指的滑动手势,因为在WM_手势中没有给出,所以我开始尝试WM_触摸。我发现这个例子的问题是,他们使用的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

为什么鼠标输入的LPRAM相同,而触摸输入的LPRAM不同?如何在PreFilterMessage中转换LParam,以便调用GetTouchInputInfo?

我最终使用了另一种方法,因为我无法实现这一点。我使用了一个透明的表单作为覆盖,希望得到正确的消息。这样我就得到了正确的LPRAM。如果需要,我还可以使用CallWindowProc和修改后的hWnd将消息转发到覆盖层下方的窗口。

这将是一个猜测,因此我将其放在注释中:检查在触摸处理期间WM\u NCHITTEST是否在某处返回HTTRANSPARENT。这可能是PreFilterMessages和WndProc之间的差异的原因。msdn表示WM_TOUCH消息不尊重窗口的透明区域。如果窗口返回HTTRANSPARENT以响应WM_NCHITTEST消息,则鼠标消息将转到父窗口,WM_TOUCH消息将直接转到窗口。Winforms中没有任何内容会导致message.LParam发生这样的更改。通过ref将消息传递给DecodeTouch相当可疑。唯一有意义的是您的代码正在修改它。或者你的窗口被注入到你的程序中的某种DLL子类化了,这在技术上也是可能的。但如果没有IMessageFilter,则会出现同样的错误行为。@Arie我为hittest消息添加了一个案例,如下案例0x0084:Debug.WriteLineHITTEST_W:+m.Result;已处理=错误;打破但结果总是0。经过大量测试,我发现了一些常数;WndProc中的LPRAM始终在应用程序启动时启动0xf110000。每增加一条新消息,就会增加30.000条。同时,PreFilterMessage中的LPRAM似乎是非常随机的。在WndProc获取PreFilterMessage之前没有完成的值之前,必须完成一些内部函数。是否有其他方法可以在消息传递到表单之前捕获它们?@HansPassant我的项目是windows 7 sdk附带的MTScratchpadWMTouch示例的修改版本。示例本身的工作方式与应有的一样,完全不受我的代码的影响。最终出现在WndProc中的LPRAM实际上工作正常。我希望在预过滤器中使用相同的LPRAM,这样我就可以在整个应用程序上处理触摸输入,而不仅仅是在单独的表单上。在他们到达WndProc之前,有一些东西修改了LPRAM,我需要自己找出使用它的方法。