0
需要将以下C++结构编组为C#。它代表来自以wm_tablet_flick消息形式出现的平板电脑触摸传感器的输入。因此我想在C#应用程序来处理这些消息:编组包含C#枚举的C++结构#
typedef struct FLICK_DATA {
FLICKACTION_COMMANDCODE iFlickActionCommandCode :5;
FLICKDIRECTION iFlickDirection :3;
BOOL fControlModifier :1;
BOOL fMenuModifier :1;
BOOL fAltGRModifier :1;
BOOL fWinModifier :1;
BOOL fShiftModifier :1;
INT iReserved :2;
BOOL fOnInkingSurface :1;
INT iActionArgument :16;
} FLICK_DATA;
其中:
typedef enum FLICKACTION_COMMANDCODE {
FLICKACTION_COMMANDCODE_NULL = 0,
FLICKACTION_COMMANDCODE_SCROLL = 1,
FLICKACTION_COMMANDCODE_APPCOMMAND = 2,
FLICKACTION_COMMANDCODE_CUSTOMKEY = 3,
FLICKACTION_COMMANDCODE_KEYMODIFIER = 4
} FLICKACTION_COMMANDCODE;
和:
typedef enum FLICKDIRECTION {
FLICKDIRECTION_RIGHT = 0,
FLICKDIRECTION_UPRIGHT = 1,
FLICKDIRECTION_UP = 2,
FLICKDIRECTION_UPLEFT = 3,
FLICKDIRECTION_LEFT = 4,
FLICKDIRECTION_DOWNLEFT = 5,
FLICKDIRECTION_DOWN = 6,
FLICKDIRECTION_DOWNRIGHT = 7,
FLICKDIRECTION_INVALID = 8
} FLICKDIRECTION;
在C#方,我得到:
[StructLayout(LayoutKind.Sequential)]
private struct FLICKDATA
{
internal FLICKACTION_COMMANDCODE iFlickActionCommandCode;
internal FLICKDIRECTION iFlickDirection;
public bool fControlModifier;
public bool fMenuModifier;
public bool fAltGRModifier;
public bool fWinModifier;
public bool fShiftModifier;
public int iReserved;
public bool fOnInkingSurface;
public int iActionArgument;
}
public enum FLICKDIRECTION
{
FLICKDIRECTION_RIGHT = 0,
FLICKDIRECTION_UPRIGHT = 1,
FLICKDIRECTION_UP = 2,
FLICKDIRECTION_UPLEFT = 3,
FLICKDIRECTION_LEFT = 4,
FLICKDIRECTION_DOWNLEFT = 5,
FLICKDIRECTION_DOWN = 6,
FLICKDIRECTION_DOWNRIGHT = 7,
FLICKDIRECTION_INVALID = 8
}
public enum FLICKACTION_COMMANDCODE
{
FLICKACTION_COMMANDCODE_NULL = 0,
FLICKACTION_COMMANDCODE_SCROLL = 1,
FLICKACTION_COMMANDCODE_APPCOMMAND = 2,
FLICKACTION_COMMANDCODE_CUSTOMKEY = 3,
FLICKACTION_COMMANDCODE_KEYMODIFIER = 4
}
然后我确定结构的大小Ë如下:
private int _flickDataSize = Marshal.SizeOf(new FLICKDATA());
最后尝试要么转换指针使用到结构:
FLICKDATA data = new FLICKDATA();
data = (FLICKDATA)Marshal.PtrToStructure(m.WParam, typeof(FLICKDATA));
或者使用内置的GetLParam方法:
data = (FLICKDATA)m.GetLParam(typeof(FLICKDATA));
但无论是解决方案的工作,并配无论是空的还是垃圾。我在这里做错了什么?