编组C++;包含枚举到C的结构# 需要将C++ C++结构编组到C语言中。它表示从平板电脑触摸传感器输入的wm_Tablet_flick信息。因此,我试图在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;
其中:编组C++;包含枚举到C的结构# 需要将C++ C++结构编组到C语言中。它表示从平板电脑触摸传感器输入的wm_Tablet_flick信息。因此,我试图在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;,c#,c++,struct,interop,marshalling,C#,C++,Struct,Interop,Marshalling,其中: typedef enum FLICKACTION_COMMANDCODE { FLICKACTION_COMMANDCODE_NULL = 0, FLICKACTION_COMMANDCODE_SCROLL = 1, FLICKACTION_COMMANDCODE_APPCOMMAND = 2, FLICKACTION_COMMANDCODE_CUSTOMKEY = 3, F
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;
以及:
在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));
但这两种解决方案都不起作用,要么是空的,要么是垃圾。我在这里做错了什么 你试过铸造数据吗?而不是像那样直接访问它?或者创建一个指向FlickData的指针。此外,没有数据是随机的!/垃圾在那里是有原因的,你只需要理解它为什么在那里 因此,请尝试创建指向FlickData的指针,或者: FLICKDATA*data=FLICKDATA; 试试看(可能要玩一玩) 尝试将Flickdata强制转换为数据变量: 自动数据(静态_-cast(FLICKDirection))
data = (FLICKDATA)m.GetLParam(typeof(FLICKDATA));