zoukankan      html  css  js  c++  java
  • C#开发: 通信篇-串口调试助手

    说明

     这节教给用户使用C#做一个串口调试助手,

     用户可在此基础上依据自己的需求做修改

     本人的其它关于串口通信的上位机也会在此基础上做修改,

     请用户认真学习本节.

    新建工程

    布局串口配置页面

    1.拖拽上来一个 GroupBox

     2.重新命名

     3.拖拽上去6个Label,位置和显示如下

    4. 拖拽上去5个ComboBox,1个Button,位置如下

    设置Button的显示改为打开串口

    -----------------------------------------------------------------------------------------------以上需要嵌入视频演示

    5. 添加ComboBox显示的内容

    5.1:以波特率的ComboBox详细叙述

    1382400
    921600
    460800
    256000
    230400
    128000
    115200
    76800
    57600
    43000
    38400
    19200
    14400
    9600
    4800
    1200


    运行一下

    5.2:设置停止位的ComboBox里面的数据

    1
    1.5
    2

    5.3:设置数据位的ComboBox里面的数据

     

    8
    7
    6
    5

    5.4:设置校验位的ComboBox里面的数据


    奇校验
    偶校验

    ----------------------------------以上需要录制演示视频

    拖拽串口控件

    获取电脑上可用串口,并显示在端口号的ComboBox里面

    1.双击窗体,进入窗体加载回调函数

    2.在页面加载函数中填写以下程序

                string[] ports = System.IO.Ports.SerialPort.GetPortNames();//获取电脑上可用串口号
                comboBox1.Items.AddRange(ports);//给comboBox1添加数据
                comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//如果里面有数据,显示第0个

    警告:请选择对应的comboBox

    comboBox1 

    3.启动

    comboBox里面显示当前电脑上可用串口号

    4. 设置下默认显示的配置

                comboBox2.Text = "115200";/*默认波特率:115200*/
                comboBox3.Text = "1";/*默认停止位:1*/
                comboBox4.Text = "8";/*默认数据位:8*/
                comboBox5.Text = "";/*默认奇偶校验位:无*/

    5.启动

    打开关闭串口

    1.双击按钮进入按钮点击事件

    2.按钮点击事件函数内部程序如下

                if (button1.Text == "打开串口"){//如果按钮显示的是打开串口
                    try{//防止意外错误
                        serialPort1.PortName = comboBox1.Text;//获取comboBox1要打开的串口号
                        serialPort1.BaudRate = int.Parse(comboBox2.Text);//获取comboBox2选择的波特率
                        serialPort1.DataBits = int.Parse(comboBox4.Text);//设置数据位
                        /*设置停止位*/
                        if (comboBox3.Text == "1") { serialPort1.StopBits = StopBits.One; }
                        else if (comboBox3.Text == "1.5") { serialPort1.StopBits = StopBits.OnePointFive; }
                        else if (comboBox3.Text == "2") { serialPort1.StopBits = StopBits.Two; }
                        /*设置奇偶校验*/
                        if (comboBox5.Text == "") { serialPort1.Parity = Parity.None; }
                        else if (comboBox5.Text == "奇校验") { serialPort1.Parity = Parity.Odd; }
                        else if (comboBox5.Text == "偶校验") { serialPort1.Parity = Parity.Even; }
    
                        serialPort1.Open();//打开串口
                        button1.Text = "关闭串口";//按钮显示关闭串口
                    }
                    catch (Exception err)
                    {
                        MessageBox.Show("打开失败"+ err.ToString(), "提示!");//对话框显示打开失败
                    }
                }
                else{//要关闭串口
                    try{//防止意外错误
                        serialPort1.Close();//关闭串口
                    }
                    catch (Exception){}
                    button1.Text = "打开串口";//按钮显示打开
                }

    提示:serialPort1

    3.启动测试

      

    检测串口热插拔

    1.在串口模块拔插的时候,重新更新下串口comboBox的内容

    然后:

    如果热插拔的是用户刚打开的串口,则按钮显示 "打开串口",comboBox显示初始化的串口号

    如果热插拔的不是用户刚打开的串口,则comboBox还是显示咱刚才的串口号

    2.用一个变量记录用户打开的串口号

    String serialPortName;
    serialPortName = comboBox1.Text;

    2.添加系统函数 protected override void WndProc(ref Message m)

            protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x0219){//设备改变
                    if (m.WParam.ToInt32() == 0x8004){//usb串口拔出
                        string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口
                        comboBox1.Items.Clear();//清除comboBox里面的数据
                        comboBox1.Items.AddRange(ports);//给comboBox1添加数据
                        if (button1.Text == "关闭串口"){//用户打开过串口
                            if (!serialPort1.IsOpen){//用户打开的串口被关闭:说明热插拔是用户打开的串口
                                button1.Text = "打开串口";
                                serialPort1.Dispose();//释放掉原先的串口资源
                                comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                            }
                            else{
                                comboBox1.Text = serialPortName;//显示用户打开的那个串口号
                            }
                        }
                        else{//用户没有打开过串口
                            comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                        }
                    }
                    else if (m.WParam.ToInt32() == 0x8000){//usb串口连接上
                        string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口
                        comboBox1.Items.Clear();
                        comboBox1.Items.AddRange(ports);
                        if (button1.Text == "关闭串口"){//用户打开过一个串口
                            comboBox1.Text = serialPortName;//显示用户打开的那个串口号
                        }
                        else{
                            comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                        }
                    }
                }
                base.WndProc(ref m);
            }

    提示:C#常用事件对应值

    /// <summary>
        /// Window API enumerations
        /// </summary>
        #region Peek Message Flags
        public enum PeekMessageFlags
        {
            PM_NOREMOVE 0,
            PM_REMOVE 1,
            PM_NOYIELD 2
        }
        #endregion
        #region Windows Messages
        public enum WinMsg
        {
            WM_NULL 0x0000,
            WM_CREATE 0x0001,
            WM_DESTROY 0x0002,
            WM_MOVE 0x0003,
            WM_SIZE 0x0005,
            WM_ACTIVATE 0x0006,
            WM_SETFOCUS 0x0007,
            WM_KILLFOCUS 0x0008,
            WM_ENABLE 0x000A,
            WM_SETREDRAW 0x000B,
            WM_SETTEXT 0x000C,
            WM_GETTEXT 0x000D,
            WM_GETTEXTLENGTH 0x000E,
            WM_PAINT 0x000F,
            WM_CLOSE 0x0010,
            WM_QUERYENDSESSION 0x0011,
            WM_QUIT 0x0012,
            WM_QUERYOPEN 0x0013,
            WM_ERASEBKGND 0x0014,
            WM_SYSCOLORCHANGE 0x0015,
            WM_ENDSESSION 0x0016,
            WM_SHOWWINDOW 0x0018,
            WM_CTLCOLOR 0x0019,
            WM_WININICHANGE 0x001A,
            WM_SETTINGCHANGE 0x001A,
            WM_DEVMODECHANGE 0x001B,
            WM_ACTIVATEAPP 0x001C,
            WM_FONTCHANGE 0x001D,
            WM_TIMECHANGE 0x001E,
            WM_CANCELMODE 0x001F,
            WM_SETCURSOR 0x0020,
            WM_MOUSEACTIVATE 0x0021,
            WM_CHILDACTIVATE 0x0022,
            WM_QUEUESYNC 0x0023,
            WM_GETMINMAXINFO 0x0024,
            WM_PAINTICON 0x0026,
            WM_ICONERASEBKGND 0x0027,
            WM_NEXTDLGCTL 0x0028,
            WM_SPOOLERSTATUS 0x002A,
            WM_DRAWITEM 0x002B,
            WM_MEASUREITEM 0x002C,
            WM_DELETEITEM 0x002D,
            WM_VKEYTOITEM 0x002E,
            WM_CHARTOITEM 0x002F,
            WM_SETFONT 0x0030,
            WM_GETFONT 0x0031,
            WM_SETHOTKEY 0x0032,
            WM_GETHOTKEY 0x0033,
            WM_QUERYDRAGICON 0x0037,
            WM_COMPAREITEM 0x0039,
            WM_GETOBJECT 0x003D,
            WM_COMPACTING 0x0041,
            WM_COMMNOTIFY 0x0044,
            WM_WINDOWPOSCHANGING 0x0046,
            WM_WINDOWPOSCHANGED 0x0047,
            WM_POWER 0x0048,
            WM_COPYDATA 0x004A,
            WM_CANCELJOURNAL 0x004B,
            WM_NOTIFY 0x004E,
            WM_INPUTLANGCHANGEREQUEST 0x0050,
            WM_INPUTLANGCHANGE 0x0051,
            WM_TCARD 0x0052,
            WM_HELP 0x0053,
            WM_USERCHANGED 0x0054,
            WM_NOTIFYFORMAT 0x0055,
            WM_CONTEXTMENU 0x007B,
            WM_STYLECHANGING 0x007C,
            WM_STYLECHANGED 0x007D,
            WM_DISPLAYCHANGE 0x007E,
            WM_GETICON 0x007F,
            WM_SETICON 0x0080,
            WM_NCCREATE 0x0081,
            WM_NCDESTROY 0x0082,
            WM_NCCALCSIZE 0x0083,
            WM_NCHITTEST 0x0084,
            WM_NCPAINT 0x0085,
            WM_NCACTIVATE 0x0086,
            WM_GETDLGCODE 0x0087,
            WM_SYNCPAINT 0x0088,
            WM_NCMOUSEMOVE 0x00A0,
            WM_NCLBUTTONDOWN 0x00A1,
            WM_NCLBUTTONUP 0x00A2,
            WM_NCLBUTTONDBLCLK 0x00A3,
            WM_NCRBUTTONDOWN 0x00A4,
            WM_NCRBUTTONUP 0x00A5,
            WM_NCRBUTTONDBLCLK 0x00A6,
            WM_NCMBUTTONDOWN 0x00A7,
            WM_NCMBUTTONUP 0x00A8,
            WM_NCMBUTTONDBLCLK 0x00A9,
            WM_KEYDOWN 0x0100,
            WM_KEYUP 0x0101,
            WM_CHAR 0x0102,
            WM_DEADCHAR 0x0103,
            WM_SYSKEYDOWN 0x0104,
            WM_SYSKEYUP 0x0105,
            WM_SYSCHAR 0x0106,
            WM_SYSDEADCHAR 0x0107,
            WM_KEYLAST 0x0108,
            WM_IME_STARTCOMPOSITION 0x010D,
            WM_IME_ENDCOMPOSITION 0x010E,
            WM_IME_COMPOSITION 0x010F,
            WM_IME_KEYLAST 0x010F,
            WM_INITDIALOG 0x0110,
            WM_COMMAND 0x0111,
            WM_SYSCOMMAND 0x0112,
            WM_TIMER 0x0113,
            WM_HSCROLL 0x0114,
            WM_VSCROLL 0x0115,
            WM_INITMENU 0x0116,
            WM_INITMENUPOPUP 0x0117,
            WM_MENUSELECT 0x011F,
            WM_MENUCHAR 0x0120,
            WM_ENTERIDLE 0x0121,
            WM_MENURBUTTONUP 0x0122,
            WM_MENUDRAG 0x0123,
            WM_MENUGETOBJECT 0x0124,
            WM_UNINITMENUPOPUP 0x0125,
            WM_MENUCOMMAND 0x0126,
            WM_CTLCOLORWinMsgBOX 0x0132,
            WM_CTLCOLOREDIT 0x0133,
            WM_CTLCOLORLISTBOX 0x0134,
            WM_CTLCOLORBTN 0x0135,
            WM_CTLCOLORDLG 0x0136,
            WM_CTLCOLORSCROLLBAR 0x0137,
            WM_CTLCOLORSTATIC 0x0138,
            WM_MOUSEMOVE 0x0200,
            WM_LBUTTONDOWN 0x0201,
            WM_LBUTTONUP 0x0202,
            WM_LBUTTONDBLCLK 0x0203,
            WM_RBUTTONDOWN 0x0204,
            WM_RBUTTONUP 0x0205,
            WM_RBUTTONDBLCLK 0x0206,
            WM_MBUTTONDOWN 0x0207,
            WM_MBUTTONUP 0x0208,
            WM_MBUTTONDBLCLK 0x0209,
            WM_MOUSEWHEEL 0x020A,
            WM_PARENTNOTIFY 0x0210,
            WM_ENTERMENULOOP 0x0211,
            WM_EXITMENULOOP 0x0212,
            WM_NEXTMENU 0x0213,
            WM_SIZING 0x0214,
            WM_CAPTURECHANGED 0x0215,
            WM_MOVING 0x0216,
            WM_DEVICECHANGE 0x0219,
            WM_MDICREATE 0x0220,
            WM_MDIDESTROY 0x0221,
            WM_MDIACTIVATE 0x0222,
            WM_MDIRESTORE 0x0223,
            WM_MDINEXT 0x0224,
            WM_MDIMAXIMIZE 0x0225,
            WM_MDITILE 0x0226,
            WM_MDICASCADE 0x0227,
            WM_MDIICONARRANGE 0x0228,
            WM_MDIGETACTIVE 0x0229,
            WM_MDISETMENU 0x0230,
            WM_ENTERSIZEMOVE 0x0231,
            WM_EXITSIZEMOVE 0x0232,
            WM_DROPFILES 0x0233,
            WM_MDIREFRESHMENU 0x0234,
            WM_IME_SETCONTEXT 0x0281,
            WM_IME_NOTIFY 0x0282,
            WM_IME_CONTROL 0x0283,
            WM_IME_COMPOSITIONFULL 0x0284,
            WM_IME_SELECT 0x0285,
            WM_IME_CHAR 0x0286,
            WM_IME_REQUEST 0x0288,
            WM_IME_KEYDOWN 0x0290,
            WM_IME_KEYUP 0x0291,
            WM_MOUSEHOVER 0x02A1,
            WM_MOUSELEAVE 0x02A3,
            WM_CUT 0x0300,
            WM_COPY 0x0301,
            WM_PASTE 0x0302,
            WM_CLEAR 0x0303,
            WM_UNDO 0x0304,
            WM_RENDERFORMAT 0x0305,
            WM_RENDERALLFORMATS 0x0306,
            WM_DESTROYCLIPBOARD 0x0307,
            WM_DRAWCLIPBOARD 0x0308,
            WM_PAINTCLIPBOARD 0x0309,
            WM_VSCROLLCLIPBOARD 0x030A,
            WM_SIZECLIPBOARD 0x030B,
            WM_ASKCBFORMATNAME 0x030C,
            WM_CHANGECBCHAIN 0x030D,
            WM_HSCROLLCLIPBOARD 0x030E,
            WM_QUERYNEWPALETTE 0x030F,
            WM_PALETTEISCHANGING 0x0310,
            WM_PALETTECHANGED 0x0311,
            WM_HOTKEY 0x0312,
            WM_PRINT 0x0317,
            WM_PRINTCLIENT 0x0318,
            WM_HANDHELDFIRST 0x0358,
            WM_HANDHELDLAST 0x035F,
            WM_AFXFIRST 0x0360,
            WM_AFXLAST 0x037F,
            WM_PENWINFIRST 0x0380,
            WM_PENWINLAST 0x038F,
            WM_APP 0x8000,
            WM_USER 0x0400,
            WM_REFLECT = WM_USER + 0x1c00
        }
        #endregion
        #region Window Styles
        public enum WindowStyles : uint
        {
            WS_OVERLAPPED 0x00000000,
            WS_POPUP 0x80000000,
            WS_CHILD 0x40000000,
            WS_MINIMIZE 0x20000000,
            WS_VISIBLE 0x10000000,
            WS_DISABLED 0x08000000,
            WS_CLIPSIBLINGS 0x04000000,
            WS_CLIPCHILDREN 0x02000000,
            WS_MAXIMIZE 0x01000000,
            WS_CAPTION 0x00C00000,
            WS_BORDER 0x00800000,
            WS_DLGFRAME 0x00400000,
            WS_VSCROLL 0x00200000,
            WS_HSCROLL 0x00100000,
            WS_SYSMENU 0x00080000,
            WS_THICKFRAME 0x00040000,
            WS_GROUP 0x00020000,
            WS_TABSTOP 0x00010000,
            WS_MINIMIZEBOX 0x00020000,
            WS_MAXIMIZEBOX 0x00010000,
            WS_TILED 0x00000000,
            WS_ICONIC 0x20000000,
            WS_SIZEBOX 0x00040000,
            WS_POPUPWINDOW 0x80880000,
            WS_OVERLAPPEDWINDOW 0x00CF0000,
            WS_TILEDWINDOW 0x00CF0000,
            WS_CHILDWINDOW 0x40000000
        }
        #endregion
        #region Window Extended Styles
        public enum WindowExStyles
        {
            WS_EX_DLGMODALFRAME 0x00000001,
            WS_EX_NOPARENTNOTIFY 0x00000004,
            WS_EX_TOPMOST 0x00000008,
            WS_EX_ACCEPTFILES 0x00000010,
            WS_EX_TRANSPARENT 0x00000020,
            WS_EX_MDICHILD 0x00000040,
            WS_EX_TOOLWINDOW 0x00000080,
            WS_EX_WINDOWEDGE 0x00000100,
            WS_EX_CLIENTEDGE 0x00000200,
            WS_EX_CONTEXTHELP 0x00000400,
            WS_EX_RIGHT 0x00001000,
            WS_EX_LEFT 0x00000000,
            WS_EX_RTLREADING 0x00002000,
            WS_EX_LTRREADING 0x00000000,
            WS_EX_LEFTSCROLLBAR 0x00004000,
            WS_EX_RIGHTSCROLLBAR 0x00000000,
            WS_EX_CONTROLPARENT 0x00010000,
            WS_EX_STATICEDGE 0x00020000,
            WS_EX_APPWINDOW 0x00040000,
            WS_EX_OVERLAPPEDWINDOW 0x00000300,
            WS_EX_PALETTEWINDOW 0x00000188,
            WS_EX_LAYERED 0x00080000
        }
        #endregion
        #region ShowWindow Styles
        public enum ShowWindowStyles : short
        {
            SW_HIDE 0,
            SW_SHOWNORMAL 1,
            SW_NORMAL 1,
            SW_SHOWMINIMIZED 2,
            SW_SHOWMAXIMIZED 3,
            SW_MAXIMIZE 3,
            SW_SHOWNOACTIVATE 4,
            SW_SHOW 5,
            SW_MINIMIZE 6,
            SW_SHOWMINNOACTIVE 7,
            SW_SHOWNA 8,
            SW_RESTORE 9,
            SW_SHOWDEFAULT 10,
            SW_FORCEMINIMIZE 11,
            SW_MAX 11
        }
        #endregion
        #region SetWindowPos Z Order
        public enum SetWindowPosZOrder
        {
            HWND_TOP 0,
            HWND_BOTTOM 1,
            HWND_TOPMOST = -1,
            HWND_NOTOPMOST = -2
        }
        #endregion
        #region SetWindowPosFlags
        public enum SetWindowPosFlags : uint
        {
            SWP_NOSIZE 0x0001,
            SWP_NOMOVE 0x0002,
            SWP_NOZORDER 0x0004,
            SWP_NOREDRAW 0x0008,
            SWP_NOACTIVATE 0x0010,
            SWP_FRAMECHANGED 0x0020,
            SWP_SHOWWINDOW 0x0040,
            SWP_HIDEWINDOW 0x0080,
            SWP_NOCOPYBITS 0x0100,
            SWP_NOOWNERZORDER 0x0200,
            SWP_NOSENDCHANGING 0x0400,
            SWP_DRAWFRAME 0x0020,
            SWP_NOREPOSITION 0x0200,
            SWP_DEFERERASE 0x2000,
            SWP_ASYNCWINDOWPOS 0x4000
        }
        #endregion
        #region Virtual Keys
        public enum VirtualKeys
        {
            VK_LBUTTON 0x01,
            VK_CANCEL 0x03,
            VK_BACK 0x08,
            VK_TAB 0x09,
            VK_CLEAR 0x0C,
            VK_RETURN 0x0D,
            VK_SHIFT 0x10,
            VK_CONTROL 0x11,
            VK_MENU 0x12,
            VK_CAPITAL 0x14,
            VK_ESCAPE 0x1B,
            VK_SPACE 0x20,
            VK_PRIOR 0x21,
            VK_NEXT 0x22,
            VK_END 0x23,
            VK_HOME 0x24,
            VK_LEFT 0x25,
            VK_UP 0x26,
            VK_RIGHT 0x27,
            VK_DOWN 0x28,
            VK_SELECT 0x29,
            VK_EXECUTE 0x2B,
            VK_SNAPSHOT 0x2C,
            VK_HELP 0x2F,
            VK_0 0x30,
            VK_1 0x31,
            VK_2 0x32,
            VK_3 0x33,
            VK_4 0x34,
            VK_5 0x35,
            VK_6 0x36,
            VK_7 0x37,
            VK_8 0x38,
            VK_9 0x39,
            VK_A 0x41,
            VK_B 0x42,
            VK_C 0x43,
            VK_D 0x44,
            VK_E 0x45,
            VK_F 0x46,
            VK_G 0x47,
            VK_H 0x48,
            VK_I 0x49,
            VK_J 0x4A,
            VK_K 0x4B,
            VK_L 0x4C,
            VK_M 0x4D,
            VK_N 0x4E,
            VK_O 0x4F,
            VK_P 0x50,
            VK_Q 0x51,
            VK_R 0x52,
            VK_S 0x53,
            VK_T 0x54,
            VK_U 0x55,
            VK_V 0x56,
            VK_W 0x57,
            VK_X 0x58,
            VK_Y 0x59,
            VK_Z 0x5A,
            VK_NUMPAD0 0x60,
            VK_NUMPAD1 0x61,
            VK_NUMPAD2 0x62,
            VK_NUMPAD3 0x63,
            VK_NUMPAD4 0x64,
            VK_NUMPAD5 0x65,
            VK_NUMPAD6 0x66,
            VK_NUMPAD7 0x67,
            VK_NUMPAD8 0x68,
            VK_NUMPAD9 0x69,
            VK_MULTIPLY 0x6A,
            VK_ADD 0x6B,
            VK_SEPARATOR 0x6C,
            VK_SUBTRACT 0x6D,
            VK_DECIMAL 0x6E,
            VK_DIVIDE 0x6F,
            VK_ATTN 0xF6,
            VK_CRSEL 0xF7,
            VK_EXSEL 0xF8,
            VK_EREOF 0xF9,
            VK_PLAY 0xFA,
            VK_ZOOM 0xFB,
            VK_NONAME 0xFC,
            VK_PA1 0xFD,
            VK_OEM_CLEAR 0xFE,
            VK_LWIN 0x5B,
            VK_RWIN 0x5C,
            VK_APPS 0x5D,
            VK_LSHIFT 0xA0,
            VK_RSHIFT 0xA1,
            VK_LCONTROL 0xA2,
            VK_RCONTROL 0xA3,
            VK_LMENU 0xA4,
            VK_RMENU 0xA5
        }
        #endregion
        #region PatBlt Types
        public enum PatBltTypes
        {
            SRCCOPY 0x00CC0020,
            SRCPAINT 0x00EE0086,
            SRCAND 0x008800C6,
            SRCINVERT 0x00660046,
            SRCERASE 0x00440328,
            NOTSRCCOPY 0x00330008,
            NOTSRCERASE 0x001100A6,
            MERGECOPY 0x00C000CA,
            MERGEPAINT 0x00BB0226,
            PATCOPY 0x00F00021,
            PATPAINT 0x00FB0A09,
            PATINVERT 0x005A0049,
            DSTINVERT 0x00550009,
            BLACKNESS 0x00000042,
            WHITENESS 0x00FF0062
        }
        #endregion
        #region Clipboard Formats
        public enum ClipboardFormats : uint
        {
            CF_TEXT 1,
            CF_BITMAP 2,
            CF_METAFILEPICT 3,
            CF_SYLK 4,
            CF_DIF 5,
            CF_TIFF 6,
            CF_OEMTEXT 7,
            CF_DIB 8,
            CF_PALETTE 9,
            CF_PENDATA 10,
            CF_RIFF 11,
            CF_WAVE 12,
            CF_UNICODETEXT 13,
            CF_ENHMETAFILE 14,
            CF_HDROP 15,
            CF_LOCALE 16,
            CF_MAX 17,
            CF_OWNERDISPLAY 0x0080,
            CF_DSPTEXT 0x0081,
            CF_DSPBITMAP 0x0082,
            CF_DSPMETAFILEPICT 0x0083,
            CF_DSPENHMETAFILE 0x008E,
            CF_PRIVATEFIRST 0x0200,
            CF_PRIVATELAST 0x02FF,
            CF_GDIOBJFIRST 0x0300,
            CF_GDIOBJLAST 0x03FF
        }
        #endregion
        #region Common Controls Initialization flags
        public enum CommonControlInitFlags
        {
            ICC_LISTVIEW_CLASSES 0x00000001,
            ICC_TREEVIEW_CLASSES 0x00000002,
            ICC_BAR_CLASSES 0x00000004,
            ICC_TAB_CLASSES 0x00000008,
            ICC_UPDOWN_CLASS 0x00000010,
            ICC_PROGRESS_CLASS 0x00000020,
            ICC_HOTKEY_CLASS 0x00000040,
            ICC_ANIMATE_CLASS 0x00000080,
            ICC_WIN95_CLASSES 0x000000FF,
            ICC_DATE_CLASSES 0x00000100,
            ICC_USEREX_CLASSES 0x00000200,
            ICC_COOL_CLASSES 0x00000400,
            ICC_INTERNET_CLASSES 0x00000800,
            ICC_PAGESCROLLER_CLASS 0x00001000,
            ICC_NATIVEFNTCTL_CLASS 0x00002000
        }
        #endregion
        #region Common Controls Styles
        public enum CommonControlStyles
        {
            CCS_TOP 0x00000001,
            CCS_NOMOVEY 0x00000002,
            CCS_BOTTOM 0x00000003,
            CCS_NORESIZE 0x00000004,
            CCS_NOPARENTALIGN 0x00000008,
            CCS_ADJUSTABLE 0x00000020,
            CCS_NODIVIDER 0x00000040,
            CCS_VERT 0x00000080,
            CCS_LEFT = (CCS_VERT | CCS_TOP),
            CCS_RIGHT = (CCS_VERT | CCS_BOTTOM),
            CCS_NOMOVEX = (CCS_VERT | CCS_NOMOVEY)
        }
        #endregion
        #region ToolBar Styles
        public enum ToolBarStyles
        {
            TBSTYLE_BUTTON 0x0000,
            TBSTYLE_SEP 0x0001,
            TBSTYLE_CHECK 0x0002,
            TBSTYLE_GROUP 0x0004,
            TBSTYLE_CHECKGROUP = (TBSTYLE_GROUP | TBSTYLE_CHECK),
            TBSTYLE_DROPDOWN 0x0008,
            TBSTYLE_AUTOSIZE 0x0010,
            TBSTYLE_NOPREFIX 0x0020,
            TBSTYLE_TOOLTIPS 0x0100,
            TBSTYLE_WRAPABLE 0x0200,
            TBSTYLE_ALTDRAG 0x0400,
            TBSTYLE_FLAT 0x0800,
            TBSTYLE_LIST 0x1000,
            TBSTYLE_CUSTOMERASE 0x2000,
            TBSTYLE_REGISTERDROP 0x4000,
            TBSTYLE_TRANSPARENT 0x8000,
            TBSTYLE_EX_DRAWDDARROWS 0x00000001
        }
        #endregion
        #region ToolBar Ex Styles
        public enum ToolBarExStyles
        {
            TBSTYLE_EX_DRAWDDARROWS 0x1,
            TBSTYLE_EX_HIDECLIPPEDBUTTONS 0x10,
            TBSTYLE_EX_DOUBLEBUFFER 0x80
        }
        #endregion
        #region ToolBar Messages
        public enum ToolBarMessages
        {
            WM_USER 0x0400,
            TB_ENABLEBUTTON = (WM_USER + 1),
            TB_CHECKBUTTON = (WM_USER + 2),
            TB_PRESSBUTTON = (WM_USER + 3),
            TB_HIDEBUTTON = (WM_USER + 4),
            TB_INDETERMINATE = (WM_USER + 5),
            TB_MARKBUTTON = (WM_USER + 6),
            TB_ISBUTTONENABLED = (WM_USER + 9),
            TB_ISBUTTONCHECKED = (WM_USER + 10),
            TB_ISBUTTONPRESSED = (WM_USER + 11),
            TB_ISBUTTONHIDDEN = (WM_USER + 12),
            TB_ISBUTTONINDETERMINATE = (WM_USER + 13),
            TB_ISBUTTONHIGHLIGHTED = (WM_USER + 14),
            TB_SETSTATE = (WM_USER + 17),
            TB_GETSTATE = (WM_USER + 18),
            TB_ADDBITMAP = (WM_USER + 19),
            TB_ADDBUTTONSA = (WM_USER + 20),
            TB_INSERTBUTTONA = (WM_USER + 21),
            TB_ADDBUTTONS = (WM_USER + 20),
            TB_INSERTBUTTON = (WM_USER + 21),
            TB_DELETEBUTTON = (WM_USER + 22),
            TB_GETBUTTON = (WM_USER + 23),
            TB_BUTTONCOUNT = (WM_USER + 24),
            TB_COMMANDTOINDEX = (WM_USER + 25),
            TB_SAVERESTOREA = (WM_USER + 26),
            TB_CUSTOMIZE = (WM_USER + 27),
            TB_ADDSTRINGA = (WM_USER + 28),
            TB_GETITEMRECT = (WM_USER + 29),
            TB_BUTTONSTRUCTSIZE = (WM_USER + 30),
            TB_SETBUTTONSIZE = (WM_USER + 31),
            TB_SETBITMAPSIZE = (WM_USER + 32),
            TB_AUTOSIZE = (WM_USER + 33),
            TB_GETTOOLTIPS = (WM_USER + 35),
            TB_SETTOOLTIPS = (WM_USER + 36),
            TB_SETPARENT = (WM_USER + 37),
            TB_SETROWS = (WM_USER + 39),
            TB_GETROWS = (WM_USER + 40),
            TB_GETBITMAPFLAGS = (WM_USER + 41),
            TB_SETCMDID = (WM_USER + 42),
            TB_CHANGEBITMAP = (WM_USER + 43),
            TB_GETBITMAP = (WM_USER + 44),
            TB_GETBUTTONTEXTA = (WM_USER + 45),
            TB_GETBUTTONTEXTW = (WM_USER + 75),
            TB_REPLACEBITMAP = (WM_USER + 46),
            TB_SETINDENT = (WM_USER + 47),
            TB_SETIMAGELIST = (WM_USER + 48),
            TB_GETIMAGELIST = (WM_USER + 49),
            TB_LOADIMAGES = (WM_USER + 50),
            TB_GETRECT = (WM_USER + 51),
            TB_SETHOTIMAGELIST = (WM_USER + 52),
            TB_GETHOTIMAGELIST = (WM_USER + 53),
            TB_SETDISABLEDIMAGELIST = (WM_USER + 54),
            TB_GETDISABLEDIMAGELIST = (WM_USER + 55),
            TB_SETSTYLE = (WM_USER + 56),
            TB_GETSTYLE = (WM_USER + 57),
            TB_GETBUTTONSIZE = (WM_USER + 58),
            TB_SETBUTTONWIDTH = (WM_USER + 59),
            TB_SETMAXTEXTROWS = (WM_USER + 60),
            TB_GETTEXTROWS = (WM_USER + 61),
            TB_GETOBJECT = (WM_USER + 62),
            TB_GETBUTTONINFOW = (WM_USER + 63),
            TB_SETBUTTONINFOW = (WM_USER + 64),
            TB_GETBUTTONINFOA = (WM_USER + 65),
            TB_SETBUTTONINFOA = (WM_USER + 66),
            TB_INSERTBUTTONW = (WM_USER + 67),
            TB_ADDBUTTONSW = (WM_USER + 68),
            TB_HITTEST = (WM_USER + 69),
            TB_SETDRAWTEXTFLAGS = (WM_USER + 70),
            TB_GETHOTITEM = (WM_USER + 71),
            TB_SETHOTITEM = (WM_USER + 72),
            TB_SETANCHORHIGHLIGHT = (WM_USER + 73),
            TB_GETANCHORHIGHLIGHT = (WM_USER + 74),
            TB_SAVERESTOREW = (WM_USER + 76),
            TB_ADDSTRINGW = (WM_USER + 77),
            TB_MAPACCELERATORA = (WM_USER + 78),
            TB_GETINSERTMARK = (WM_USER + 79),
            TB_SETINSERTMARK = (WM_USER + 80),
            TB_INSERTMARKHITTEST = (WM_USER + 81),
            TB_MOVEBUTTON = (WM_USER + 82),
            TB_GETMAXSIZE = (WM_USER + 83),
            TB_SETEXTENDEDSTYLE = (WM_USER + 84),
            TB_GETEXTENDEDSTYLE = (WM_USER + 85),
            TB_GETPADDING = (WM_USER + 86),
            TB_SETPADDING = (WM_USER + 87),
            TB_SETINSERTMARKCOLOR = (WM_USER + 88),
            TB_GETINSERTMARKCOLOR = (WM_USER + 89)
        }
        #endregion
        #region ToolBar Notifications
        public enum ToolBarNotifications
        {
            TTN_NEEDTEXTA = ((0 - 520) - 0),
            TTN_NEEDTEXTW = ((0 - 520) - 10),
            TBN_QUERYINSERT = ((0 - 700) - 6),
            TBN_DROPDOWN = ((0 - 700) - 10),
            TBN_HOTITEMCHANGE = ((0 - 700) - 13)
        }
        #endregion
        #region Reflected Messages
        public enum ReflectedMessages
        {
            OCM__BASE = (WinMsg.WM_USER + 0x1c00),
            OCM_COMMAND = (OCM__BASE + WinMsg.WM_COMMAND),
            OCM_CTLCOLORBTN = (OCM__BASE + WinMsg.WM_CTLCOLORBTN),
            OCM_CTLCOLOREDIT = (OCM__BASE + WinMsg.WM_CTLCOLOREDIT),
            OCM_CTLCOLORDLG = (OCM__BASE + WinMsg.WM_CTLCOLORDLG),
            OCM_CTLCOLORLISTBOX = (OCM__BASE + WinMsg.WM_CTLCOLORLISTBOX),
            OCM_CTLCOLORWinMsgBOX = (OCM__BASE + WinMsg.WM_CTLCOLORWinMsgBOX),
            OCM_CTLCOLORSCROLLBAR = (OCM__BASE + WinMsg.WM_CTLCOLORSCROLLBAR),
            OCM_CTLCOLORSTATIC = (OCM__BASE + WinMsg.WM_CTLCOLORSTATIC),
            OCM_CTLCOLOR = (OCM__BASE + WinMsg.WM_CTLCOLOR),
            OCM_DRAWITEM = (OCM__BASE + WinMsg.WM_DRAWITEM),
            OCM_MEASUREITEM = (OCM__BASE + WinMsg.WM_MEASUREITEM),
            OCM_DELETEITEM = (OCM__BASE + WinMsg.WM_DELETEITEM),
            OCM_VKEYTOITEM = (OCM__BASE + WinMsg.WM_VKEYTOITEM),
            OCM_CHARTOITEM = (OCM__BASE + WinMsg.WM_CHARTOITEM),
            OCM_COMPAREITEM = (OCM__BASE + WinMsg.WM_COMPAREITEM),
            OCM_HSCROLL = (OCM__BASE + WinMsg.WM_HSCROLL),
            OCM_VSCROLL = (OCM__BASE + WinMsg.WM_VSCROLL),
            OCM_PARENTNOTIFY = (OCM__BASE + WinMsg.WM_PARENTNOTIFY),
            OCM_NOTIFY = (OCM__BASE + WinMsg.WM_NOTIFY)
        }
        #endregion
        #region Notification Messages
        public enum NotificationMessages
        {
            NM_FIRST = (0 - 0),
            NM_CUSTOMDRAW = (NM_FIRST - 12),
            NM_NCHITTEST = (NM_FIRST - 14)
        }
        #endregion
        #region ToolTip Flags
        public enum ToolTipFlags
        {
            TTF_CENTERTIP 0x0002,
            TTF_RTLREADING 0x0004,
            TTF_SUBCLASS 0x0010,
            TTF_TRACK 0x0020,
            TTF_ABSOLUTE 0x0080,
            TTF_TRANSPARENT 0x0100,
            TTF_DI_SETITEM 0x8000
        }
        #endregion
        #region Custom Draw Return Flags
        public enum CustomDrawReturnFlags
        {
            CDRF_DODEFAULT 0x00000000,
            CDRF_NEWFONT 0x00000002,
            CDRF_SKIPDEFAULT 0x00000004,
            CDRF_NOTIFYPOSTPAINT 0x00000010,
            CDRF_NOTIFYITEMDRAW 0x00000020,
            CDRF_NOTIFYSUBITEMDRAW 0x00000020,
            CDRF_NOTIFYPOSTERASE 0x00000040
        }
        #endregion
        #region Custom Draw Item State Flags
        public enum CustomDrawItemStateFlags
        {
            CDIS_SELECTED 0x0001,
            CDIS_GRAYED 0x0002,
            CDIS_DISABLED 0x0004,
            CDIS_CHECKED 0x0008,
            CDIS_FOCUS 0x0010,
            CDIS_DEFAULT 0x0020,
            CDIS_HOT 0x0040,
            CDIS_MARKED 0x0080,
            CDIS_INDETERMINATE 0x0100
        }
        #endregion
        #region Custom Draw Draw State Flags
        public enum CustomDrawDrawStateFlags
        {
            CDDS_PREPAINT 0x00000001,
            CDDS_POSTPAINT 0x00000002,
            CDDS_PREERASE 0x00000003,
            CDDS_POSTERASE 0x00000004,
            CDDS_ITEM 0x00010000,
            CDDS_ITEMPREPAINT = (CDDS_ITEM | CDDS_PREPAINT),
            CDDS_ITEMPOSTPAINT = (CDDS_ITEM | CDDS_POSTPAINT),
            CDDS_ITEMPREERASE = (CDDS_ITEM | CDDS_PREERASE),
            CDDS_ITEMPOSTERASE = (CDDS_ITEM | CDDS_POSTERASE),
            CDDS_SUBITEM 0x00020000
        }
        #endregion
        #region Toolbar button info flags
        public enum ToolBarButtonInfoFlags
        {
            TBIF_IMAGE 0x00000001,
            TBIF_TEXT 0x00000002,
            TBIF_STATE 0x00000004,
            TBIF_STYLE 0x00000008,
            TBIF_LPARAM 0x00000010,
            TBIF_COMMAND 0x00000020,
            TBIF_SIZE 0x00000040,
            I_IMAGECALLBACK = -1,
            I_IMAGENONE = -2
        }
        #endregion
        #region Toolbar button styles
        public enum ToolBarButtonStyles
        {
            TBSTYLE_BUTTON 0x0000,
            TBSTYLE_SEP 0x0001,
            TBSTYLE_CHECK 0x0002,
            TBSTYLE_GROUP 0x0004,
            TBSTYLE_CHECKGROUP = (TBSTYLE_GROUP | TBSTYLE_CHECK),
            TBSTYLE_DROPDOWN 0x0008,
            TBSTYLE_AUTOSIZE 0x0010,
            TBSTYLE_NOPREFIX 0x0020,
            TBSTYLE_TOOLTIPS 0x0100,
            TBSTYLE_WRAPABLE 0x0200,
            TBSTYLE_ALTDRAG 0x0400,
            TBSTYLE_FLAT 0x0800,
            TBSTYLE_LIST 0x1000,
            TBSTYLE_CUSTOMERASE 0x2000,
            TBSTYLE_REGISTERDROP 0x4000,
            TBSTYLE_TRANSPARENT 0x8000,
            TBSTYLE_EX_DRAWDDARROWS 0x00000001
        }
        #endregion
        #region Toolbar button state
        public enum ToolBarButtonStates
        {
            TBSTATE_CHECKED 0x01,
            TBSTATE_PRESSED 0x02,
            TBSTATE_ENABLED 0x04,
            TBSTATE_HIDDEN 0x08,
            TBSTATE_INDETERMINATE 0x10,
            TBSTATE_WRAP 0x20,
            TBSTATE_ELLIPSES 0x40,
            TBSTATE_MARKED 0x80
        }
        #endregion
        #region Windows Hook Codes
        public enum WindowsHookCodes
        {
            WH_MSGFILTER = (-1),
            WH_JOURNALRECORD 0,
            WH_JOURNALPLAYBACK 1,
            WH_KEYBOARD 2,
            WH_GETMESSAGE 3,
            WH_CALLWNDPROC 4,
            WH_CBT 5,
            WH_SYSMSGFILTER 6,
            WH_MOUSE 7,
            WH_HARDWARE 8,
            WH_DEBUG 9,
            WH_SHELL 10,
            WH_FOREGROUNDIDLE 11,
            WH_CALLWNDPROCRET 12,
            WH_KEYBOARD_LL 13,
            WH_MOUSE_LL 14
        }
        #endregion
        #region Mouse Hook Filters
        public enum MouseHookFilters
        {
            MSGF_DIALOGBOX 0,
            MSGF_MESSAGEBOX 1,
            MSGF_MENU 2,
            MSGF_SCROLLBAR 5,
            MSGF_NEXTWINDOW 6
        }
        #endregion
        #region Draw Text format flags
        public enum DrawTextFormatFlags
        {
            DT_TOP 0x00000000,
            DT_LEFT 0x00000000,
            DT_CENTER 0x00000001,
            DT_RIGHT 0x00000002,
            DT_VCENTER 0x00000004,
            DT_BOTTOM 0x00000008,
            DT_WORDBREAK 0x00000010,
            DT_SINGLELINE 0x00000020,
            DT_EXPANDTABS 0x00000040,
            DT_TABSTOP 0x00000080,
            DT_NOCLIP 0x00000100,
            DT_EXTERNALLEADING 0x00000200,
            DT_CALCRECT 0x00000400,
            DT_NOPREFIX 0x00000800,
            DT_INTERNAL 0x00001000,
            DT_EDITCONTROL 0x00002000,
            DT_PATH_ELLIPSIS 0x00004000,
            DT_END_ELLIPSIS 0x00008000,
            DT_MODIFYSTRING 0x00010000,
            DT_RTLREADING 0x00020000,
            DT_WORD_ELLIPSIS 0x00040000
        }
        #endregion
        #region Rebar Styles
        public enum RebarStyles
        {
            RBS_TOOLTIPS 0x0100,
            RBS_VARHEIGHT 0x0200,
            RBS_BANDBORDERS 0x0400,
            RBS_FIXEDORDER 0x0800,
            RBS_REGISTERDROP 0x1000,
            RBS_AUTOSIZE 0x2000,
            RBS_VERTICALGRIPPER 0x4000,
            RBS_DBLCLKTOGGLE 0x8000,
        }
        #endregion
        #region Rebar Notifications
        public enum RebarNotifications
        {
            RBN_FIRST = (0 - 831),
            RBN_HEIGHTCHANGE = (RBN_FIRST - 0),
            RBN_GETOBJECT = (RBN_FIRST - 1),
            RBN_LAYOUTCHANGED = (RBN_FIRST - 2),
            RBN_AUTOSIZE = (RBN_FIRST - 3),
            RBN_BEGINDRAG = (RBN_FIRST - 4),
            RBN_ENDDRAG = (RBN_FIRST - 5),
            RBN_DELETINGBAND = (RBN_FIRST - 6),
            RBN_DELETEDBAND = (RBN_FIRST - 7),
            RBN_CHILDSIZE = (RBN_FIRST - 8),
            RBN_CHEVRONPUSHED = (RBN_FIRST - 10)
        }
        #endregion
        #region Rebar Messages
        public enum RebarMessages
        {
            CCM_FIRST 0x2000,
            WM_USER 0x0400,
            RB_INSERTBANDA = (WM_USER + 1),
            RB_DELETEBAND = (WM_USER + 2),
            RB_GETBARINFO = (WM_USER + 3),
            RB_SETBARINFO = (WM_USER + 4),
            RB_GETBANDINFO = (WM_USER + 5),
            RB_SETBANDINFOA = (WM_USER + 6),
            RB_SETPARENT = (WM_USER + 7),
            RB_HITTEST = (WM_USER + 8),
            RB_GETRECT = (WM_USER + 9),
            RB_INSERTBANDW = (WM_USER + 10),
            RB_SETBANDINFOW = (WM_USER + 11),
            RB_GETBANDCOUNT = (WM_USER + 12),
            RB_GETROWCOUNT = (WM_USER + 13),
            RB_GETROWHEIGHT = (WM_USER + 14),
            RB_IDTOINDEX = (WM_USER + 16),
            RB_GETTOOLTIPS = (WM_USER + 17),
            RB_SETTOOLTIPS = (WM_USER + 18),
            RB_SETBKCOLOR = (WM_USER + 19),
            RB_GETBKCOLOR = (WM_USER + 20),
            RB_SETTEXTCOLOR = (WM_USER + 21),
            RB_GETTEXTCOLOR = (WM_USER + 22),
            RB_SIZETORECT = (WM_USER + 23),
            RB_SETCOLORSCHEME = (CCM_FIRST + 2),
            RB_GETCOLORSCHEME = (CCM_FIRST + 3),
            RB_BEGINDRAG = (WM_USER + 24),
            RB_ENDDRAG = (WM_USER + 25),
            RB_DRAGMOVE = (WM_USER + 26),
            RB_GETBARHEIGHT = (WM_USER + 27),
            RB_GETBANDINFOW = (WM_USER + 28),
            RB_GETBANDINFOA = (WM_USER + 29),
            RB_MINIMIZEBAND = (WM_USER + 30),
            RB_MAXIMIZEBAND = (WM_USER + 31),
            RB_GETDROPTARGET = (CCM_FIRST + 4),
            RB_GETBANDBORDERS = (WM_USER + 34),
            RB_SHOWBAND = (WM_USER + 35),
            RB_SETPALETTE = (WM_USER + 37),
            RB_GETPALETTE = (WM_USER + 38),
            RB_MOVEBAND = (WM_USER + 39),
            RB_SETUNICODEFORMAT = (CCM_FIRST + 5),
            RB_GETUNICODEFORMAT = (CCM_FIRST + 6)
        }
        #endregion
        #region Rebar Info Mask
        public enum RebarInfoMask
        {
            RBBIM_STYLE 0x00000001,
            RBBIM_COLORS 0x00000002,
            RBBIM_TEXT 0x00000004,
            RBBIM_IMAGE 0x00000008,
            RBBIM_CHILD 0x00000010,
            RBBIM_CHILDSIZE 0x00000020,
            RBBIM_SIZE 0x00000040,
            RBBIM_BACKGROUND 0x00000080,
            RBBIM_ID 0x00000100,
            RBBIM_IDEALSIZE 0x00000200,
            RBBIM_LPARAM 0x00000400,
            BBIM_HEADERSIZE 0x00000800
        }
        #endregion
        #region Rebar Styles
        public enum RebarStylesEx
        {
            RBBS_BREAK 0x1,
            RBBS_CHILDEDGE 0x4,
            RBBS_FIXEDBMP 0x20,
            RBBS_GRIPPERALWAYS 0x80,
            RBBS_USECHEVRON 0x200
        }
        #endregion
        #region Object types
        public enum ObjectTypes
        {
            OBJ_PEN 1,
            OBJ_BRUSH 2,
            OBJ_DC 3,
            OBJ_METADC 4,
            OBJ_PAL 5,
            OBJ_FONT 6,
            OBJ_BITMAP 7,
            OBJ_REGION 8,
            OBJ_METAFILE 9,
            OBJ_MEMDC 10,
            OBJ_EXTPEN 11,
            OBJ_ENHMETADC 12,
            OBJ_ENHMETAFILE 13
        }
        #endregion
        #region WM_MENUCHAR return values
        public enum MenuCharReturnValues
        {
            MNC_IGNORE 0,
            MNC_CLOSE 1,
            MNC_EXECUTE 2,
            MNC_SELECT 3
        }
        #endregion
        #region Background Mode
        public enum BackgroundMode
        {
            TRANSPARENT 1,
            OPAQUE 2
        }
        #endregion
        #region ListView Messages
        public enum ListViewMessages
        {
            LVM_FIRST 0x1000,
            LVM_GETSUBITEMRECT = (LVM_FIRST + 56),
            LVM_GETITEMSTATE = (LVM_FIRST + 44),
            LVM_GETITEMTEXTW = (LVM_FIRST + 115)
        }
        #endregion
        #region Header Control Messages
        public enum HeaderControlMessages : int
        {
            HDM_FIRST 0x1200,
            HDM_GETITEMRECT = (HDM_FIRST + 7),
            HDM_HITTEST = (HDM_FIRST + 6),
            HDM_SETIMAGELIST = (HDM_FIRST + 8),
            HDM_GETITEMW = (HDM_FIRST + 11),
            HDM_ORDERTOINDEX = (HDM_FIRST + 15)
        }
        #endregion
        #region Header Control Notifications
        public enum HeaderControlNotifications
        {
            HDN_FIRST = (0 - 300),
            HDN_BEGINTRACKW = (HDN_FIRST - 26),
            HDN_ENDTRACKW = (HDN_FIRST - 27),
            HDN_ITEMCLICKW = (HDN_FIRST - 22),
        }
        #endregion
        #region Header Control HitTest Flags
        public enum HeaderControlHitTestFlags : uint
        {
            HHT_NOWHERE 0x0001,
            HHT_ONHEADER 0x0002,
            HHT_ONDIVIDER 0x0004,
            HHT_ONDIVOPEN 0x0008,
            HHT_ABOVE 0x0100,
            HHT_BELOW 0x0200,
            HHT_TORIGHT 0x0400,
            HHT_TOLEFT 0x0800
        }
        #endregion
        #region List View sub item portion
        public enum SubItemPortion
        {
            LVIR_BOUNDS 0,
            LVIR_ICON 1,
            LVIR_LABEL 2
        }
        #endregion
        #region Cursor Type
        public enum CursorType : uint
        {
            IDC_ARROW 32512U,
            IDC_IBEAM 32513U,
            IDC_WAIT 32514U,
            IDC_CROSS 32515U,
            IDC_UPARROW 32516U,
            IDC_SIZE 32640U,
            IDC_ICON 32641U,
            IDC_SIZENWSE 32642U,
            IDC_SIZENESW 32643U,
            IDC_SIZEWE 32644U,
            IDC_SIZENS 32645U,
            IDC_SIZEALL 32646U,
            IDC_NO 32648U,
            IDC_HAND 32649U,
            IDC_APPSTARTING 32650U,
            IDC_HELP 32651U
        }
        #endregion
        #region Tracker Event Flags
        public enum TrackerEventFlags : uint
        {
            TME_HOVER 0x00000001,
            TME_LEAVE 0x00000002,
            TME_QUERY 0x40000000,
            TME_CANCEL 0x80000000
        }
        #endregion
        #region Mouse Activate Flags
        public enum MouseActivateFlags
        {
            MA_ACTIVATE 1,
            MA_ACTIVATEANDEAT 2,
            MA_NOACTIVATE 3,
            MA_NOACTIVATEANDEAT 4
        }
        #endregion
        #region Dialog Codes
        public enum DialogCodes
        {
            DLGC_WANTARROWS 0x0001,
            DLGC_WANTTAB 0x0002,
            DLGC_WANTALLKEYS 0x0004,
            DLGC_WANTMESSAGE 0x0004,
            DLGC_HASSETSEL 0x0008,
            DLGC_DEFPUSHBUTTON 0x0010,
            DLGC_UNDEFPUSHBUTTON 0x0020,
            DLGC_RADIOBUTTON 0x0040,
            DLGC_WANTCHARS 0x0080,
            DLGC_STATIC 0x0100,
            DLGC_BUTTON 0x2000
        }
        #endregion
        #region Update Layered Windows Flags
        public enum UpdateLayeredWindowsFlags
        {
            ULW_COLORKEY 0x00000001,
            ULW_ALPHA 0x00000002,
            ULW_OPAQUE 0x00000004
        }
        #endregion
        #region Alpha Flags
        public enum AlphaFlags : byte
        {
            AC_SRC_OVER 0x00,
            AC_SRC_ALPHA 0x01
        }
        #endregion
        #region ComboBox messages
        public enum ComboBoxMessages
        {
            CB_GETDROPPEDSTATE 0x0157
        }
        #endregion
        #region SetWindowLong indexes
        public enum SetWindowLongOffsets
        {
            GWL_WNDPROC = (-4),
            GWL_HINSTANCE = (-6),
            GWL_HWNDPARENT = (-8),
            GWL_STYLE = (-16),
            GWL_EXSTYLE = (-20),
            GWL_USERDATA = (-21),
            GWL_ID = (-12)
        }
        #endregion
        #region TreeView Messages
        public enum TreeViewMessages
        {
            TV_FIRST 0x1100,
            TVM_GETITEMRECT = (TV_FIRST + 4),
            TVM_GETITEMW = (TV_FIRST + 62)
        }
        #endregion
        #region TreeViewItem Flags
        public enum TreeViewItemFlags
        {
            TVIF_TEXT 0x0001,
            TVIF_IMAGE 0x0002,
            TVIF_PARAM 0x0004,
            TVIF_STATE 0x0008,
            TVIF_HANDLE 0x0010,
            TVIF_SELECTEDIMAGE 0x0020,
            TVIF_CHILDREN 0x0040,
            TVIF_INTEGRAL 0x0080
        }
        #endregion
        #region ListViewItem flags
        public enum ListViewItemFlags
        {
            LVIF_TEXT 0x0001,
            LVIF_IMAGE 0x0002,
            LVIF_PARAM 0x0004,
            LVIF_STATE 0x0008,
            LVIF_INDENT 0x0010,
            LVIF_NORECOMPUTE 0x0800
        }
        #endregion
        #region HeaderItem flags
        public enum HeaderItemFlags
        {
            HDI_WIDTH 0x0001,
            HDI_HEIGHT = HDI_WIDTH,
            HDI_TEXT 0x0002,
            HDI_FORMAT 0x0004,
            HDI_LPARAM 0x0008,
            HDI_BITMAP 0x0010,
            HDI_IMAGE 0x0020,
            HDI_DI_SETITEM 0x0040,
            HDI_ORDER 0x0080
        }
        #endregion
        #region GetDCExFlags
        public enum GetDCExFlags
        {
            DCX_WINDOW 0x00000001,
            DCX_CACHE 0x00000002,
            DCX_NORESETATTRS 0x00000004,
            DCX_CLIPCHILDREN 0x00000008,
            DCX_CLIPSIBLINGS 0x00000010,
            DCX_PARENTCLIP 0x00000020,
            DCX_EXCLUDERGN 0x00000040,
            DCX_INTERSECTRGN 0x00000080,
            DCX_EXCLUDEUPDATE 0x00000100,
            DCX_INTERSECTUPDATE 0x00000200,
            DCX_LOCKWINDOWUPDATE 0x00000400,
            DCX_VALIDATE 0x00200000
        }
        #endregion
        #region HitTest
        public enum HitTest
        {
            HTERROR = (-2),
            HTTRANSPARENT = (-1),
            HTNOWHERE 0,
            HTCLIENT 1,
            HTCAPTION 2,
            HTSYSMENU 3,
            HTGROWBOX 4,
            HTSIZE = HTGROWBOX,
            HTMENU 5,
            HTHSCROLL 6,
            HTVSCROLL 7,
            HTMINBUTTON 8,
            HTMAXBUTTON 9,
            HTLEFT 10,
            HTRIGHT 11,
            HTTOP 12,
            HTTOPLEFT 13,
            HTTOPRIGHT 14,
            HTBOTTOM 15,
            HTBOTTOMLEFT 16,
            HTBOTTOMRIGHT 17,
            HTBORDER 18,
            HTREDUCE = HTMINBUTTON,
            HTZOOM = HTMAXBUTTON,
            HTSIZEFIRST = HTLEFT,
            HTSIZELAST = HTBOTTOMRIGHT,
            HTOBJECT 19,
            HTCLOSE 20,
            HTHELP 21
        }
        #endregion
        #region ActivateFlags
        public enum ActivateState
        {
            WA_INACTIVE 0,
            WA_ACTIVE 1,
            WA_CLICKACTIVE 2
        }
        #endregion
        #region StrechModeFlags
        public enum StrechModeFlags
        {
            BLACKONWHITE 1,
            WHITEONBLACK 2,
            COLORONCOLOR 3,
            HALFTONE 4,
            MAXSTRETCHBLTMODE 4
        }
        #endregion
        #region ScrollBarFlags
        public enum ScrollBarFlags
        {
            SBS_HORZ 0x0000,
            SBS_VERT 0x0001,
            SBS_TOPALIGN 0x0002,
            SBS_LEFTALIGN 0x0002,
            SBS_BOTTOMALIGN 0x0004,
            SBS_RIGHTALIGN 0x0004,
            SBS_SIZEBOXTOPLEFTALIGN 0x0002,
            SBS_SIZEBOXBOTTOMRIGHTALIGN 0x0004,
            SBS_SIZEBOX 0x0008,
            SBS_SIZEGRIP 0x0010
        }
        #endregion
        #region System Metrics Codes
        public enum SystemMetricsCodes
        {
            SM_CXSCREEN 0,
            SM_CYSCREEN 1,
            SM_CXVSCROLL 2,
            SM_CYHSCROLL 3,
            SM_CYCAPTION 4,
            SM_CXBORDER 5,
            SM_CYBORDER 6,
            SM_CXDLGFRAME 7,
            SM_CYDLGFRAME 8,
            SM_CYVTHUMB 9,
            SM_CXHTHUMB 10,
            SM_CXICON 11,
            SM_CYICON 12,
            SM_CXCURSOR 13,
            SM_CYCURSOR 14,
            SM_CYMENU 15,
            SM_CXFULLSCREEN 16,
            SM_CYFULLSCREEN 17,
            SM_CYKANJIWINDOW 18,
            SM_MOUSEPRESENT 19,
            SM_CYVSCROLL 20,
            SM_CXHSCROLL 21,
            SM_DEBUG 22,
            SM_SWAPBUTTON 23,
            SM_RESERVED1 24,
            SM_RESERVED2 25,
            SM_RESERVED3 26,
            SM_RESERVED4 27,
            SM_CXMIN 28,
            SM_CYMIN 29,
            SM_CXSIZE 30,
            SM_CYSIZE 31,
            SM_CXFRAME 32,
            SM_CYFRAME 33,
            SM_CXMINTRACK 34,
            SM_CYMINTRACK 35,
            SM_CXDOUBLECLK 36,
            SM_CYDOUBLECLK 37,
            SM_CXICONSPACING 38,
            SM_CYICONSPACING 39,
            SM_MENUDROPALIGNMENT 40,
            SM_PENWINDOWS 41,
            SM_DBCSENABLED 42,
            SM_CMOUSEBUTTONS 43,
            SM_CXFIXEDFRAME = SM_CXDLGFRAME,
            SM_CYFIXEDFRAME = SM_CYDLGFRAME,
            SM_CXSIZEFRAME = SM_CXFRAME,
            SM_CYSIZEFRAME = SM_CYFRAME,
            SM_SECURE 44,
            SM_CXEDGE 45,
            SM_CYEDGE 46,
            SM_CXMINSPACING 47,
            SM_CYMINSPACING 48,
            SM_CXSMICON 49,
            SM_CYSMICON 50,
            SM_CYSMCAPTION 51,
            SM_CXSMSIZE 52,
            SM_CYSMSIZE 53,
            SM_CXMENUSIZE 54,
            SM_CYMENUSIZE 55,
            SM_ARRANGE 56,
            SM_CXMINIMIZED 57,
            SM_CYMINIMIZED 58,
            SM_CXMAXTRACK 59,
            SM_CYMAXTRACK 60,
            SM_CXMAXIMIZED 61,
            SM_CYMAXIMIZED 62,
            SM_NETWORK 63,
            SM_CLEANBOOT 67,
            SM_CXDRAG 68,
            SM_CYDRAG 69,
            SM_SHOWSOUNDS 70,
            SM_CXMENUCHECK 71,
            SM_CYMENUCHECK 72,
            SM_SLOWMACHINE 73,
            SM_MIDEASTENABLED 74,
            SM_MOUSEWHEELPRESENT 75,
            SM_XVIRTUALSCREEN 76,
            SM_YVIRTUALSCREEN 77,
            SM_CXVIRTUALSCREEN 78,
            SM_CYVIRTUALSCREEN 79,
            SM_CMONITORS 80,
            SM_SAMEDISPLAYFORMAT 81,
            SM_CMETRICS 83
        }
        #endregion
        #region ScrollBarTypes
        public enum ScrollBarTypes
        {
            SB_HORZ 0,
            SB_VERT 1,
            SB_CTL 2,
            SB_BOTH 3
        }
        #endregion
        #region SrollBarInfoFlags
        public enum ScrollBarInfoFlags
        {
            SIF_RANGE 0x0001,
            SIF_PAGE 0x0002,
            SIF_POS 0x0004,
            SIF_DISABLENOSCROLL 0x0008,
            SIF_TRACKPOS 0x0010,
            SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)
        }
        #endregion
        #region Enable ScrollBar flags
        public enum EnableScrollBarFlags
        {
            ESB_ENABLE_BOTH 0x0000,
            ESB_DISABLE_BOTH 0x0003,
            ESB_DISABLE_LEFT 0x0001,
            ESB_DISABLE_RIGHT 0x0002,
            ESB_DISABLE_UP 0x0001,
            ESB_DISABLE_DOWN 0x0002,
            ESB_DISABLE_LTUP = ESB_DISABLE_LEFT,
            ESB_DISABLE_RTDN = ESB_DISABLE_RIGHT
        }
        #endregion
        #region Scroll Requests
        public enum ScrollBarRequests
        {
            SB_LINEUP 0,
            SB_LINELEFT 0,
            SB_LINEDOWN 1,
            SB_LINERIGHT 1,
            SB_PAGEUP 2,
            SB_PAGELEFT 2,
            SB_PAGEDOWN 3,
            SB_PAGERIGHT 3,
            SB_THUMBPOSITION 4,
            SB_THUMBTRACK 5,
            SB_TOP 6,
            SB_LEFT 6,
            SB_BOTTOM 7,
            SB_RIGHT 7,
            SB_ENDSCROLL 8
        }
        #endregion
        #region SrollWindowEx flags
        public enum ScrollWindowExFlags
        {
            SW_SCROLLCHILDREN 0x0001,
            SW_INVALIDATE 0x0002,
            SW_ERASE 0x0004,
            SW_SMOOTHSCROLL 0x0010
        }
        #endregion
        #region ImageListFlags
        public enum ImageListFlags
        {
            ILC_MASK 0x0001,
            ILC_COLOR 0x0000,
            ILC_COLORDDB 0x00FE,
            ILC_COLOR4 0x0004,
            ILC_COLOR8 0x0008,
            ILC_COLOR16 0x0010,
            ILC_COLOR24 0x0018,
            ILC_COLOR32 0x0020,
            ILC_PALETTE 0x0800
        }
        #endregion
        #region List View Notifications
        public enum ListViewNotifications
        {
            LVN_FIRST = (0 - 100),
            LVN_GETDISPINFOW = (LVN_FIRST - 77),
            LVN_SETDISPINFOA = (LVN_FIRST - 51)
        }
        #endregion
    
    }
    View Code

    3.启动测试 :用户自己测试热插拔

    串口接收数据

    1.拖拽上来一个TextBox

    2.点击TextBox上面的箭头,选择MultiLine (允许显示多行)

     2.拖拽TextBox使其达到自己满意的长宽,

    设置TextBox的Scrollbars属性为Vertical  (显示竖直滚动条,可以滚动显示接收数据)

    3.为了更好看些,设置TextBox的背景色为黑色 (Black) 

    显示的字体颜色为草绿色 (LawnGreen)

    4.选择serialPort1 -> 选择事件 -> 双击DataReceived

    生成串口接收回调函数

    5.在回调函数中接收数据,然后把接收数据显示在TextBox

                int len = serialPort1.BytesToRead;//获取可以读取的字节数
                byte[] buff = new byte[len];//创建缓存数据数组
                serialPort1.Read(buff, 0, len);//把数据读取到buff数组
                string str = Encoding.Default.GetString(buff);//Byte值根据ASCII码表转为 String
                Invoke((new Action(() => //C# 3.0以后代替委托的新方法
                {
                    textBox1.AppendText(str);//对话框追加显示数据
                })));

    6.测试接收数据

    为了测试接收数据,可以安装虚拟串口软件

    https://qqqqqbucket.oss-cn-beijing.aliyuncs.com/LearnC%23/VSPD6.9.zip

    安装好以后

    提示:

    按照上面的操作以后

    电脑上便会有了COM1和COM2

    COM1发送的数据将会自动发送给COM2

    COM2发送的数据将会自动发送给COM1

    7.测试

    8.增加选择16进制显示(CheckBox),增加数据清除按钮

    9.关于显示字符串和显示16进制说明

    在上面的测试接收中COM1那个串口调试助手发送的

    数据为字符串 123456

    实际传输是按照ASCii码表传输的对应的16进制

    实际上buff数组

    buff[0] = 49 = 0x31

    执行 string str = Encoding.Default.GetString(buff); 以后

    str = 0 (字符串0)

    所以接收显示为:123456

    当COM1选择16进制传输的时候

    假设传输的是0x01 0x02 0x03 0x04 0x05 0x06

    COM1实际发送也是:0x01 0x02 0x03 0x04 0x05 0x06

    不过ASCII码表中显示的字符是乱码

    所以咱们需要另外添加转换程序

    程序如下:

            /// <字节数组转16进制字符串>
            /// <param name="bytes"></param>
            /// <returns> String 16进制显示形式</returns>
            public static string byteToHexStr(byte[] bytes)
            {
                string returnStr = "";
                try
                {
                    if (bytes != null)
                    {
                        for (int i = 0; i < bytes.Length; i++)
                        {
                            returnStr += bytes[i].ToString("X2");
                            returnStr += " ";//两个16进制用空格隔开,方便看数据
                        }
                    }
                    return returnStr;
                }
                catch (Exception)
                {
                    return returnStr;
                }
            }

    实际上就一句话:

    bytes[i].ToString("X2");  

    如果变量是 0x01

    则经过函数以后会返回 "01" ,字符串形式

    10.如果用户选择16进制,则接收的数据按照16进制显示

            private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                int len = serialPort1.BytesToRead;//获取可以读取的字节数
                byte[] buff = new byte[len];//创建缓存数据数组
                serialPort1.Read(buff, 0, len);//把数据读取到buff数组
                
                Invoke((new Action(() =>{//C# 3.0以后代替委托的新方法
                    if (checkBox1.Checked){//16进制显示
                        textBox1.AppendText(byteToHexStr(buff));
                    }
                    else{
                        textBox1.AppendText(Encoding.Default.GetString(buff));//对话框追加显示数据
                    }
                })));
            }
    
            /// <字节数组转16进制字符串>
            /// <param name="bytes"></param>
            /// <returns> String 16进制显示形式</returns>
            public static string byteToHexStr(byte[] bytes)
            {
                string returnStr = "";
                try{
                    if (bytes != null){
                        for (int i = 0; i < bytes.Length; i++){
                            returnStr += bytes[i].ToString("X2");
                            returnStr += " ";//两个16进制用空格隔开,方便看数据
                        }
                    }
                    return returnStr;
                }
                catch (Exception){
                    return returnStr;
                }
            }

    11.测试

    12.双击清除接收按钮,生成按钮点击事件

    写上 textBox1.Clear(); //清除接收对话框显示的数据

    串口发送数据

    1.页面布局如下:

    2.双击点击发送按钮,生成按钮点击事件

    3.事件函数中,程序如下

                String Str = textBox2.Text.ToString();//获取发送文本框里面的数据
                try
                {
                    if (Str.Length > 0)
                    {
                        serialPort1.Write(Str);//串口发送数据
                    }
                }
                catch (Exception){ }

    4.测试发送数据

     

    5.发送16进制数据说明

    首先需要明确

    假设文本框里面填写的是:01 02 03 04 05 06

    Str获取的是01 02 03 04 05 06  是字符串

    咱所希望的是把01转为0x01

    02转为0x02

    .

    .

    .

    然后发送

    首先先说思路

    默认把文本框每隔两个字符作为一个16进制数

    假设文本框中是

    010203040506   (偶数个数据)

    则01 ,02 ,03 ,04 ,05 ,06 分别作为16进制

    如果文本框中的字符个数是奇数个

    1115268

    则默认先把前面每隔两个作为一个16进制数

    最后一个数前面补零

    0x11,0x15,0x26,0x08

    封装的解析转换程序如下:

            /// <字符串转16进制格式,不够自动前面补零>
            /// 
            /// </summary>
            /// <param name="hexString"></param>
            /// <returns></returns>
            private static byte[] strToToHexByte(String hexString)
            {
                int i;
                hexString = hexString.Replace(" ", "");//清除空格
                if ((hexString.Length % 2) != 0)//奇数个
                {
                    byte[] returnBytes = new byte[(hexString.Length + 1) / 2];
                    try
                    {
                        for (i = 0; i < (hexString.Length - 1) / 2; i++)
                        {
                            returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                        }
                        returnBytes[returnBytes.Length - 1] = Convert.ToByte(hexString.Substring(hexString.Length - 1, 1).PadLeft(2, '0'), 16);
                    }
                    catch
                    {
                        MessageBox.Show("含有非16进制字符", "提示");
                        return null;
                    }
                    return returnBytes;
                }
                else
                {
                    byte[] returnBytes = new byte[(hexString.Length) / 2];
                    try
                    {
                        for (i = 0; i < returnBytes.Length; i++)
                        {
                            returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                        }
                    }
                    catch
                    {
                        MessageBox.Show("含有非16进制字符", "提示");
                        return null;
                    }
                    return returnBytes;
                }
            }

    6.完善发送16进制程序

            private void button3_Click(object sender, EventArgs e)
            {
                String Str = textBox2.Text.ToString();//获取发送文本框里面的数据
                try
                {
                    if (Str.Length > 0)
                    {
                        if (checkBox2.Checked)//16进制发送
                        {
                            byte[] byt = strToToHexByte(Str);
                            serialPort1.Write(byt, 0, byt.Length);
                        }
                        else
                        {
                            serialPort1.Write(Str);//串口发送数据
                        }
                    }
                }
                catch (Exception){ }
            }
    
    
            /// <字符串转16进制格式,不够自动前面补零>
            /// 
            /// </summary>
            /// <param name="hexString"></param>
            /// <returns></returns>
            private static byte[] strToToHexByte(String hexString)
            {
                int i;
                hexString = hexString.Replace(" ", "");//清除空格
                if ((hexString.Length % 2) != 0)//奇数个
                {
                    byte[] returnBytes = new byte[(hexString.Length + 1) / 2];
                    try
                    {
                        for (i = 0; i < (hexString.Length - 1) / 2; i++)
                        {
                            returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                        }
                        returnBytes[returnBytes.Length - 1] = Convert.ToByte(hexString.Substring(hexString.Length - 1, 1).PadLeft(2, '0'), 16);
                    }
                    catch
                    {
                        MessageBox.Show("含有非16进制字符", "提示");
                        return null;
                    }
                    return returnBytes;
                }
                else
                {
                    byte[] returnBytes = new byte[(hexString.Length) / 2];
                    try
                    {
                        for (i = 0; i < returnBytes.Length; i++)
                        {
                            returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                        }
                    }
                    catch
                    {
                        MessageBox.Show("含有非16进制字符", "提示");
                        return null;
                    }
                    return returnBytes;
                }
            }

    7.测试

    8.双击 清除发送 按钮,生成按钮点击事件

    textBox2.Clear();//清除发送文本框里面的内容

     

    提醒

    提醒

    提醒

    C#的串口中断回调函数也是不定个数的进入

    假设另一个串口发送的数据为 123456

    int len = serialPort1.BytesToRead;//获取可以读取的字节数
    byte[] buff = new byte[len];//创建缓存数据数组

    serialPort1.Read(buff, 0, len);//把数据读取到buff数组

    len 可能等于 2

    则存入buff 的数据为 

    buff [0] = '1'

    buff [1] = '2'

    然后接着又进来这个函数

    len 可能等于 4

    则存入buff 的数据为 

    buff [0] = '3'

    buff [1] = '4'

    buff [2] = '5'

    buff [3] = '6'

    如若想接收到一条完整的数据以后再进行处理

    可参考: https://www.cnblogs.com/yangfengwu/p/11669373.html

    增加一个定时器,用于空闲时间检测

  • 相关阅读:
    《剑指Offer》二维数组中的查找
    白话计算机入门书籍--《穿越计算机的迷雾》有感
    Mysql Cluster7.5.6在 windows10 部署安装
    Mysql Cluster7.5.6 windows10 部署安装
    lll
    线程控制
    动态链接库相关知识
    二分查找及其变种简单易懂的模版
    白话 STL next_permutation 原理
    Maven本地上有包还去网上找包
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/12382103.html
Copyright © 2011-2022 走看看