我正在创建一个游戏,在XNA,并希望实现适当的输入处理,这是XNA缺乏一个荒谬的程度。我有一个实现IMessageFilter的类,它可以拦截窗口消息并像普通的消息泵那样传递给TranslateMessage (当然不是XNA的)。
我被困/不确定的部分是如何从IMessageFilter.PreFilterMessage(ref Message)提供的IMessageFilter.PreFilterMessage(ref Message)到Windows使用的struct tagMSG {...}。
现在,我可以这样使用P/Invoke:
[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不包含time或POINT的定义,这是Windows所需的。
我的问题如下:
time、pointX和pointY填写0并让TranslateMessage仍然正常工作吗?Marshal.StructureToPtr复制Message结构并将其直接传递给TranslateMessage的代码。Message是否以正确的布局顺序包含隐藏字段?因为MSDN和Object只给出了属性,从这些属性中,我应该得出结论,它缺少time和POINT,顺序是错误的。那么,向TranslateMessage传递消息的最佳方式是什么,这样它才能为我创建那些非常想要的WM_CHAR?
发布于 2014-05-02 14:15:38
我决定通过编写一个简单的程序来测试问题2,结果如下:
在Win32上,struct MSG是28个字节,Message是20个字节。Message添加了一个字段result,它是一个IntPtr,但是缺少time和POINT字段。
使用struct MSG或Message +对剩下的8个字节进行归零处理,结果是相同的。这两个属性都具有相同的hwnd、message、wparam和lparam,其余的属性都为0。
得出的结论是,Message确实以正确的顺序包含了前几个成员,但是由于它太小,直接使用是不安全的。然而,使用朴素实现的测试程序缺乏崩溃似乎表明TranslateMessage没有查看缺少的字段,但这是猜测。
至于问题1,它似乎没有问题:TranslateMessage生成正确的WM_CHAR消息。我认为,只要应用程序不使用time或POINT字段,它就应该工作。
https://stackoverflow.com/questions/23231447
复制相似问题