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));
但無論是解決方案的工作,並配無論是空的還是垃圾。我在這裏做錯了什麼?