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