2015-03-02 72 views
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)); 

但无论是解决方案的工作,并配无论是空的还是垃圾。我在这里做错了什么?

回答

-1

您是否尝试过投射数据?而不是直接尝试像这样访问它?或者可能创建一个指向FlickData的指针。也没有数据是随机的!/垃圾它的原因,你只需要了解为什么它那里。

所以是尝试创建一个指向FlickData或:

FLICKDATA *数据= FLICKDATA; 尝试是(也许有发挥与它周围)

尝试和投Flickdata到您的数据varible: 自动数据(的static_cast(FLICKDirection);