首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从TranslateMessage中的.NET调用IMessageFilter

从TranslateMessage中的.NET调用IMessageFilter
EN

Stack Overflow用户
提问于 2014-04-22 22:29:56
回答 1查看 989关注 0票数 0

我正在创建一个游戏,在XNA,并希望实现适当的输入处理,这是XNA缺乏一个荒谬的程度。我有一个实现IMessageFilter的类,它可以拦截窗口消息并像普通的消息泵那样传递给TranslateMessage (当然不是XNA的)。

我被困/不确定的部分是如何从IMessageFilter.PreFilterMessage(ref Message)提供的IMessageFilter.PreFilterMessage(ref Message)到Windows使用的struct tagMSG {...}

现在,我可以这样使用P/Invoke:

代码语言:javascript
复制
    [StructLayout(LayoutKind.Sequential)]
    private struct MSG
    {
        public IntPtr   hwnd;
        public int      message;
        public IntPtr   wParam;
        public IntPtr   lParam;
        public uint     time;
        public int      pointX;
        public int      pointY;
    }

    [DllImport("user32.dll")]
    private static extern bool TranslateMessage([In] ref MSG m);

但问题是,Message不包含timePOINT的定义,这是Windows所需的。

我的问题如下:

  1. 我能为timepointXpointY填写0并让TranslateMessage仍然正常工作吗?
  2. 我看到了其他使用Marshal.StructureToPtr复制Message结构并将其直接传递给TranslateMessage的代码。Message是否以正确的布局顺序包含隐藏字段?因为MSDN和Object只给出了属性,从这些属性中,我应该得出结论,它缺少timePOINT,顺序是错误的。

那么,向TranslateMessage传递消息的最佳方式是什么,这样它才能为我创建那些非常想要的WM_CHAR

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-02 14:15:38

我决定通过编写一个简单的程序来测试问题2,结果如下:

在Win32上,struct MSG是28个字节,Message是20个字节。Message添加了一个字段result,它是一个IntPtr,但是缺少timePOINT字段。

使用struct MSGMessage +对剩下的8个字节进行归零处理,结果是相同的。这两个属性都具有相同的hwndmessagewparamlparam,其余的属性都为0。

得出的结论是,Message确实以正确的顺序包含了前几个成员,但是由于它太小,直接使用是不安全的。然而,使用朴素实现的测试程序缺乏崩溃似乎表明TranslateMessage没有查看缺少的字段,但这是猜测。

至于问题1,它似乎没有问题:TranslateMessage生成正确的WM_CHAR消息。我认为,只要应用程序不使用timePOINT字段,它就应该工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23231447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档