C#解析Message时32位与64位软件目标平台的结构体定义问
2024-06-16 本文已影响0人
堆石成山
我遇到的问题是:网上找的控件,在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),
}