C#解析Message时32位与64位软件目标平台的结构体定义问题

我遇到的问题是:网上找的控件,在32位软件目标平台可以正常工作,但是在64位软件目标平台出错。后来下载了控件源码,经过多次测试分析,发现是在重写方法WndProc内解析消息时定义的结构体在32位和64位软件目标平台返回结果不一致导致。

在WndProc里可以处理窗体操作发送过来的信息,在解析时,32位与64位软件目标平台的结构体定义会有所不同。

拿NMHDR为例。NMHDR(Notify Message Handler)通常为定义的通知消息定义的结构体,可以通过M.GetLParam()来获取详细的信息Code。

32位软件目标平台可定义如下:

 public struct NMHDR
{
      public IntPtr hwndFrom;
      public int idFrom;
      public int code;      
}

或者

 public struct NMHDR
{
      public IntPtr hwndFrom;
      public uint idFrom;
      public uint code;         
}

但是64位软件目标平台需要这样定义:

 public struct NMHDR
{
      public IntPtr hwndFrom;
      public IntPtr  idFrom;
      public int code;           
}

这样通过如下方法就可以正确解析Message具体通知信息了。

/// <summary>
/// WndProc
/// </summary>
/// <param name="m"></param>
 protected override void WndProc(ref Message m)
{
    switch ((WindowMessages)m.Msg)
    {
       case (WindowMessages)ReflectedMessages.NOTIFY:
             NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR));
             if(nmhdr.code=-100)
             {
                //具体处理操作
              }
          break;      
       //...其他case  
    }
    base.WndProc(ref m);
}

 public struct NMHDR
{
      public IntPtr hwndFrom;
      public IntPtr idFrom;
      public int code;        
 }   
/// <summary>
/// Window messages / WM
/// </summary>
public enum WindowMessages
{
            APP = 32768,
            ACTIVATE = 6,
            ACTIVATEAPP = 28,
            AFXFIRST = 864,
            AFXLAST = 895,
            ASKCBFORMATNAME = 780,
            CANCELJOURNAL = 75,
            CANCELMODE = 31,
            CAPTURECHANGED = 533,
            CHANGECBCHAIN = 781,
            CHAR = 258,
            CHARTOITEM = 47,
            CHILDACTIVATE = 34,
            CLEAR = 771,
            CLOSE = 16,
            COMMAND = 273,
            COMMNOTIFY = 68,
            COMPACTING = 65,
            COMPAREITEM = 57,
            CONTEXTMENU = 123,
            COPY = 769,
            COPYDATA = 74,
            CREATE = 1,
            CTLCOLOR = 0x0019,
            CTLCOLORBTN = 309,
            CTLCOLORDLG = 310,
            CTLCOLOREDIT = 307,
            CTLCOLORLISTBOX = 308,
            CTLCOLORMSGBOX = 306,
            CTLCOLORSCROLLBAR = 311,
            CTLCOLORSTATIC = 312,
            CUT = 768,
            DEADCHAR = 259,
            DELETEITEM = 45,
            DESTROY = 2,
            DESTROYCLIPBOARD = 775,
            DEVICECHANGE = 537,
            DEVMODECHANGE = 27,
            DISPLAYCHANGE = 126,
            DRAWCLIPBOARD = 776,
            DRAWITEM = 43,
            DROPFILES = 563,
            ENABLE = 10,
            ENDSESSION = 22,
            ENTERIDLE = 289,
            ENTERMENULOOP = 529,
            ENTERSIZEMOVE = 561,
            ERASEBKGND = 20,
            EXITMENULOOP = 530,
            EXITSIZEMOVE = 562,
            FONTCHANGE = 29,
            GETDLGCODE = 135,
            GETFONT = 49,
            GETHOTKEY = 51,
            GETICON = 127,
            GETMINMAXINFO = 36,
            GETTEXT = 13,
            GETTEXTLENGTH = 14,
            HANDHELDFIRST = 856,
            HANDHELDLAST = 863,
            HELP = 83,
            HOTKEY = 786,
            HSCROLL = 276,
            HSCROLLCLIPBOARD = 782,
            ICONERASEBKGND = 39,
            INITDIALOG = 272,
            INITMENU = 278,
            INITMENUPOPUP = 279,
            UNINITMENUPOPUP = 293,
            INPUTLANGCHANGE = 81,
            INPUTLANGCHANGEREQUEST = 80,
            KEYDOWN = 256,
            KEYUP = 257,
            KILLFOCUS = 8,
            MDIACTIVATE = 546,
            MDICASCADE = 551,
            MDICREATE = 544,
            MDIDESTROY = 545,
            MDIGETACTIVE = 553,
            MDIICONARRANGE = 552,
            MDIMAXIMIZE = 549,
            MDINEXT = 548,
            MDIREFRESHMENU = 564,
            MDIRESTORE = 547,
            MDISETMENU = 560,
            MDITILE = 550,
            MEASUREITEM = 44,
            MENUCHAR = 288,
            MENUSELECT = 287,
            MENUCOMMAND = 294,
            NEXTMENU = 531,
            MOVE = 3,
            MOVING = 534,
            NCACTIVATE = 134,
            NCCALCSIZE = 131,
            NCCREATE = 129,
            NCDESTROY = 130,
            NCHITTEST = 132,
            NCLBUTTONDBLCLK = 163,
            NCLBUTTONDOWN = 161,
            NCLBUTTONUP = 162,
            NCMBUTTONDBLCLK = 169,
            NCMBUTTONDOWN = 167,
            NCMBUTTONUP = 168,
            NCMOUSEMOVE = 160,
            NCPAINT = 133,
            NCRBUTTONDBLCLK = 166,
            NCRBUTTONDOWN = 164,
            NCRBUTTONUP = 165,
            NEXTDLGCTL = 40,
            NOTIFY = 78,
            NOTIFYFORMAT = 85,
            NULL = 0,
            PAINT = 15,
            PAINTCLIPBOARD = 777,
            PAINTICON = 38,
            PALETTECHANGED = 785,
            PALETTEISCHANGING = 784,
            PARENTNOTIFY = 528,
            PASTE = 770,
            PENWINFIRST = 896,
            PENWINLAST = 911,
            POWER = 72,
            POWERBROADCAST = 536,
            PRINT = 791,
            PRINTCLIENT = 792,
            QUERYDRAGICON = 55,
            QUERYENDSESSION = 17,
            QUERYNEWPALETTE = 783,
            QUERYOPEN = 19,
            QUEUESYNC = 35,
            QUIT = 18,
            RENDERALLFORMATS = 774,
            RENDERFORMAT = 773,
            SETCURSOR = 32,
            SETFOCUS = 7,
            SETFONT = 48,
            SETHOTKEY = 50,
            SETICON = 128,
            SETREDRAW = 11,
            SETTEXT = 12,
            SETTINGCHANGE = 26,
            SHOWWINDOW = 24,
            SIZE = 5,
            SIZECLIPBOARD = 779,
            SIZING = 532,
            SPOOLERSTATUS = 42,
            STYLECHANGED = 125,
            STYLECHANGING = 124,
            SYSCHAR = 262,
            SYSCOLORCHANGE = 21,
            SYSCOMMAND = 274,
            SYSDEADCHAR = 263,
            SYSKEYDOWN = 260,
            SYSKEYUP = 261,
            TCARD = 82,
            TIMECHANGE = 30,
            TIMER = 275,
            UNDO = 772,
            USER = 1024,
            USERCHANGED = 84,
            VKEYTOITEM = 46,
            VSCROLL = 277,
            VSCROLLCLIPBOARD = 778,
            WINDOWPOSCHANGED = 71,
            WINDOWPOSCHANGING = 70,
            WININICHANGE = 26,
            KEYFIRST = 256,
            KEYLAST = 264,
            SYNCPAINT = 136,
            MOUSEACTIVATE = 33,
            MOUSEMOVE = 512,
            LBUTTONDOWN = 513,
            LBUTTONUP = 514,
            LBUTTONDBLCLK = 515,
            RBUTTONDOWN = 516,
            RBUTTONUP = 517,
            RBUTTONDBLCLK = 518,
            MBUTTONDOWN = 519,
            MBUTTONUP = 520,
            MBUTTONDBLCLK = 521,
            MOUSEWHEEL = 522,
            MOUSEFIRST = 512,
            MOUSELAST = 522,
            MOUSEHOVER = 0x2A1,
            MOUSELEAVE = 0x2A3,
            SHNOTIFY = 0x0401,
            UNICHAR = 0x0109,
            THEMECHANGED = 0x031A,
}
/// <summary>
/// Reflected Messages / OCM
/// </summary>
public enum ReflectedMessages
{
            _BASE           = (WindowMessages.USER+0x1c00),
            COMMAND         = (_BASE + WindowMessages.COMMAND),
            CTLCOLORBTN     = (_BASE + WindowMessages.CTLCOLORBTN),
            CTLCOLOREDIT    = (_BASE + WindowMessages.CTLCOLOREDIT),
            CTLCOLORDLG     = (_BASE + WindowMessages.CTLCOLORDLG),
            CTLCOLORLISTBOX = (_BASE + WindowMessages.CTLCOLORLISTBOX),
            CTLCOLORMSGBOX  = (_BASE + WindowMessages.CTLCOLORMSGBOX),
            CTLCOLORSCROLLBAR  = (_BASE + WindowMessages.CTLCOLORSCROLLBAR),
            CTLCOLORSTATIC  = (_BASE + WindowMessages.CTLCOLORSTATIC),
            CTLCOLOR        = (_BASE + WindowMessages.CTLCOLOR),
            DRAWITEM        = (_BASE + WindowMessages.DRAWITEM),
            MEASUREITEM     = (_BASE + WindowMessages.MEASUREITEM),
            DELETEITEM      = (_BASE + WindowMessages.DELETEITEM),
            VKEYTOITEM      = (_BASE + WindowMessages.VKEYTOITEM),
            CHARTOITEM      = (_BASE + WindowMessages.CHARTOITEM),
            COMPAREITEM     = (_BASE + WindowMessages.COMPAREITEM),
            HSCROLL         = (_BASE + WindowMessages.HSCROLL),
            VSCROLL         = (_BASE + WindowMessages.VSCROLL),
            PARENTNOTIFY    = (_BASE + WindowMessages.PARENTNOTIFY),
            NOTIFY           = (_BASE + WindowMessages.NOTIFY),
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353