Cómo interceptar el método de entrada resultado de entrada del control con entrada de texto C #

Cómo interceptar el método de entrada resultado del control con entrada de texto C #
original Mu Yuyingfeng se publicó por última vez en 2016-05-31 19:24:15 Lectura número 2207 Favoritos
Expandir
Recientemente, estoy desarrollando un software de terminal en serie, que necesita realizar la entrada de caracteres chinos Similar al Hyper Terminal, ingrese un carácter chino o una cadena de caracteres chinos y envíelo al puerto serie inmediatamente.

Para las letras, es muy simple, puede controlar las teclas. Si se trata de caracteres chinos, no funcionará. Debido a que los caracteres chinos son ingresados ​​por el método de entrada, el control de texto no admite la entrada del método de entrada para generar eventos. Entonces necesitamos encontrar otra manera.

Busqué en línea durante mucho tiempo, pero nunca encontré una buena solución.

Consulte este blog y haga clic para abrir el enlace.

Encontró la idea, pero el propietario no resolvió el problema a la perfección. Entonces resolví el problema completamente basado en él

El primero es cómo obtener el resultado del método de entrada.

El código es el siguiente:

</pre> <pre name = "code" class = "csharp"> eGCS_RESULTSTR = 0x0800,
clase pública GetImeComposition
    {
        [DllImport ("Imm32.dll")]
        público estático externo IntPtr ImmGetContext (IntPtr hWnd);
        [DllImport ("Imm32.dll")]
        público estático externo bool ImmReleaseContext (IntPtr hWnd, IntPtr hIMC);
        [DllImport ("Imm32.dll", CharSet = CharSet.Unicode)]
        privado estático externo int ImmGetCompositionStringW (IntPtr hIMC, int dwIndex, byte [] lpBuf, int dwBufLen);






            pruebe
            {
                int strLen = ImmGetCompositionStringW (hIMC, (int) emImeGcs.eGCS_RESULTSTR, null, 0);
 
                if (strLen> 0)
                {
                    byte [] buffer = nuevo byte [strLen];
                    ImmGetCompositionStringW (hIMC, (int) emImeGcs.eGCS_RESULTSTR, buffer, strLen);
                    return Encoding.Unicode.GetString (buffer);
                }
                else
                {
                    return string.Empty;
                }
            }
            finalmente
            {
                ImmReleaseContext (handle, hIMC);
            }
        }
    }

El siguiente es el control personalizado.
Se necesitan diferentes controles para crear diferentes clases. Aquí uso RichTextBox

public class CmdRichTextBox: RichTextBox
    {
        public delegate void PrecessImeStrCallBack (string str);
        public PrecessImeStrCallBack ProcessIme = nulo;
        getImeComposition privado getImeStr = new GetImeComposition ();
        string imeStr;
 
        anulación protegida anular WndProc (ref Mensaje m)
        {
            switch (m.Msg)
            {
                // 判断 系统 消息 的 ID 号 
                // case (int) emWinMsg.eWM_TIMECHANGE:
                // case (int) emWinMsg.eWM_IME_STARTCOMPOSITION:
                // case (int ) emWinMsg.eWM_IME_ENDCOMPOSITION:
                case (int) emWinMsg.eWM_IME_COMPOSITION:
                // case (int) emWinMsg.eWM_IME_KEYLAST:
                // case (int) emWinMsg.eWM_TIMER:
                case (int) emWinMsg.eWM_IME_SETCONTEXT:
                // case (int) emWinMsg.eWM_IME_NOTIFY:
                // case (int) emW_MONT_I.MW_MONT_I.MW_MM_TIMER:
                // case (int) caso (int) emWinMsg.eWM_IME_COMPOSITIONFULL:
                // caso (int) emWinMsg.eWM_IME_SELECT:
                // caso (int) emWinMsg.eWM_IME_CHAR:
                // caso (int) emWinMsg.eWM_IME_REQUEST:
                // caso (int) emWinMsg.eWM_IME_KEYDOWN:
                // case (int) emWinMsg.eWM_IME_KEYUP:
                    break;
                case (int) emWinMsg.eWM_IME_ENDCOMPOSITION:
                    imeStr = getImeStr.CurrentCompStr (this.Handle);
                    //Debug.WriteLine(imeStr);
                    if (ProcessIme! = null)
                    {
                        ProcessIme (imeStr);
                    }
                    descanso
                valor predeterminado:
                    base.WndProc (ref m);
                    descanso;
            }
        }
    }

Adjuntar definición de valor de enumeración


public enum emWinMsg
    {
        eWM_NULL = 0x0000,
        eWM_CREATE = 0x0001,
        eWM_DESTROY = 0x0002,
        eWM_MOVE = 0x0003,
        eWM_SIZE = 0x0005,
        eWM_ACTIVATE = 0x0006,
        eWM_SETFOCUS = 0x0007,
        eWM_KILLFOCUS = 0x0008,
        eWM_ENABLE = 0x000A,
        eWM_SETREDRAW = 0x000B,
        eWM_SETTEXT = 0x000C,
        eWM_GETTEXT = 0x000D,
        eWM_GETTEXTLENGTH = 0x000E,
        eWM_PAINT = 0x000F,
        eWM_CLOSE = 0x0010,
        eWM_QUERYENDSESSION = 0x0011,
        eWM_QUIT = 0x0012,
        eWM_QUERYOPEN = 0x0013,
        eWM_ERASEBKGND = 0x0014,
        eWM_SYSCOLORCHANGE = 0x0015,
        eWM_ENDSESSION = 0x0016,
        eWM_SHOWWINDOW = 0x0018,
        eWM_CTLCOLOR = 0x0019,
        eWM_WININICHANGE = 0x001A,
        eWM_SETTINGCHANGE = 0x001A,
        eWM_DEVMODECHANGE = 0x001B,
        eWM_ACTIVATEAPP = 0x001C,
        eWM_FONTCHANGE = 0x001D,
        eWM_TIMECHANGE = 0x001E,
        eWM_CANCELMODE = 0x001F,
        eWM_SETCURSOR = 0x0020,
        eWM_MOUSEACTIVATE = 0x0021,
        eWM_CHILDACTIVATE = 0x0022,
        eWM_QUEUESYNC = 0x0023,
        eWM_GETMINMAXINFO = 0x0024,
        eWM_PAINTICON = 0x0026,
        eWM_ICONERASEBKGND = 0x0027,
        eWM_NEXTDLGCTL = 0x0028,
        eWM_SPOOLERSTATUS = 0x002A,
        eWM_DRAWITEM = 0x002B,
        eWM_MEASUREITEM = 0x002C,
        eWM_DELETEITEM = 0x002D,
        eWM_VKEYTOITEM = 0x002E,
        eWM_CHARTOITEM = 0x002F,
        eWM_SETFONT = 0x0030,
        eWM_GETFONT = 0x0031,
        eWM_SETHOTKEY = 0x0032,
        eWM_GETHOTKEY = 0x0033,
        eWM_QUERYDRAGICON = 0x0037,
        eWM_COMPAREITEM = 0x0039,
        eWM_GETOBJECT = 0x003D,
        eWM_COMPACTING = 0x0041,
        eWM_COMMNOTIFY = 0x0044,
        eWM_WINDOWPOSCHANGING = 0x0046,
        eWM_WINDOWPOSCHANGED = 0x0047,
        eWM_POWER = 0x0048,
        eWM_COPYDATA = 0x004A,
        eWM_CANCELJOURNAL = 0x004B,
        eWM_NOTIFY = 0x004E,
        eWM_INPUTLANGCHANGEREQUEST = 0x0050,
        eWM_INPUTLANGCHANGE = 0x0051,
        eWM_TCARD = 0x0052,
        eWM_HELP = 0x0053,
        eWM_USERCHANGED = 0x0054,
        eWM_NOTIFYFORMAT = 0x0055,
        eWM_CONTEXTMENU = 0x007B,
        eWM_STYLECHANGING = 0x007C,
        eWM_STYLECHANGED = 0x007D,
        eWM_DISPLAYCHANGE = 0x007E,
        eWM_GETICON = 0x007F,
        eWM_SETICON = 0x0080,
        eWM_NCCREATE = 0x0081,
        eWM_NCDESTROY = 0x0082,
        eWM_NCCALCSIZE = 0x0083,
        eWM_NCHITTEST = 0x0084,
        eWM_NCPAINT = 0x0085,
        eWM_NCACTIVATE = 0x0086,
        eWM_GETDLGCODE = 0x0087,
        eWM_SYNCPAINT = 0x0088,
        eWM_NCMOUSEMOVE = 0x00A0,
        eWM_NCLBUTTONDOWN = 0x00A1,
        eWM_NCLBUTTONUP = 0x00A2,
        eWM_NCLBUTTONDBLCLK = 0x00A3,
        eWM_NCRBUTTONDOWN = 0x00A4,
        eWM_NCRBUTTONUP = 0x00A5,
        eWM_NCRBUTTONDBLCLK = 0x00A6,
        eWM_NCMBUTTONDOWN = 0x00A7,
        eWM_NCMBUTTONUP = 0x00A8,
        eWM_NCMBUTTONDBLCLK = 0x00A9,
        eWM_KEYDOWN = 0x0100,
        eWM_KEYUP = 0x0101,
        eWM_CHAR = 0x0102,
        eWM_DEADCHAR = 0x0103,
        eWM_SYSKEYDOWN = 0x0104,
        eWM_SYSKEYUP = 0x0105,
        eWM_SYSCHAR = 0x0106,
        eWM_SYSDEADCHAR = 0x0107,
        eWM_KEYLAST = 0x0108,
        eWM_IME_STARTCOMPOSITION = 0x010D,
        eWM_IME_ENDCOMPOSITION = 0x010E,
        eWM_IME_COMPOSITION = 0x010F,
        eWM_IME_KEYLAST = 0x010F,
        eWM_INITDIALOG = 0x0110,
        eWM_COMMAND = 0x0111,
        eWM_SYSCOMMAND = 0x0112,
        eWM_TIMER = 0x0113,
        eWM_HSCROLL = 0x0114,
        eWM_VSCROLL = 0x0115,
        eWM_INITMENU = 0x0116,
        eWM_INITMENUPOPUP = 0x0117,
        eWM_MENUSELECT = 0x011F,
        eWM_MENUCHAR = 0x0120,
        eWM_ENTERIDLE = 0x0121,
        eWM_MENURBUTTONUP = 0x0122,
        eWM_MENUDRAG = 0x0123,
        eWM_MENUGETOBJECT = 0x0124,
        eWM_UNINITMENUPOPUP = 0x0125,
        eWM_MENUCOMMAND = 0x0126,
        eWM_CTLCOLORWinMsgBOX = 0x0132,
        eWM_CTLCOLOREDIT = 0x0133,
        eWM_CTLCOLORLISTBOX = 0x0134,
        eWM_CTLCOLORBTN = 0x0135,
        eWM_CTLCOLORDLG = 0x0136,
        eWM_CTLCOLORSCROLLBAR = 0x0137,
        eWM_CTLCOLORSTATIC = 0x0138,
        eWM_MOUSEMOVE = 0x0200,
        eWM_LBUTTONDOWN = 0x0201,
        eWM_LBUTTONUP = 0x0202,
        eWM_LBUTTONDBLCLK = 0x0203,
        eWM_RBUTTONDOWN = 0x0204,
        eWM_RBUTTONUP = 0x0205,
        eWM_RBUTTONDBLCLK = 0x0206,
        eWM_MBUTTONDOWN = 0x0207,
        eWM_MBUTTONUP = 0x0208,
        eWM_MBUTTONDBLCLK = 0x0209,
        eWM_MOUSEWHEEL = 0x020A,
        eWM_PARENTNOTIFY = 0x0210,
        eWM_ENTERMENULOOP = 0x0211,
        eWM_EXITMENULOOP = 0x0212,
        eWM_NEXTMENU = 0x0213,
        eWM_SIZING = 0x0214,
        eWM_CAPTURECHANGED = 0x0215,
        eWM_MOVING = 0x0216,
        eWM_DEVICECHANGE = 0x0219,
        eWM_MDICREATE = 0x0220,
        eWM_MDIDESTROY = 0x0221,
        eWM_MDIACTIVATE = 0x0222,
        eWM_MDIRESTORE = 0x0223,
        eWM_MDINEXT = 0x0224,
        eWM_MDIMAXIMIZE = 0x0225,
        eWM_MDITILE = 0x0226,
        eWM_MDICASCADE = 0x0227,
        eWM_MDIICONARRANGE = 0x0228,
        eWM_MDIGETACTIVE = 0x0229,
        eWM_MDISETMENU = 0x0230,
        eWM_ENTERSIZEMOVE = 0x0231,
        eWM_EXITSIZEMOVE = 0x0232,
        eWM_DROPFILES = 0x0233,
        eWM_MDIREFRESHMENU = 0x0234,
        eWM_IME_SETCONTEXT = 0x0281,
        eWM_IME_NOTIFY = 0x02,
        eWM_IME_CONTROL = 0x0283,
        eWM_IME_COMPOSITIONFULL = 0x0284,
        eWM_IME_SELECT = 0x0285,
        eWM_IME_CHAR = 0x0286,
        eWM_IME_REQUEST = 0x0288,
        eWM_IME_KEYDOWN = 0x0290,
        eWM_IME_KEYUP = 0x0291,
        eWM_MOUSEHOVER = 0x02A1,
        eWM_MOUSELEAVE = 0x02A3,
        eWM_CUT = 0x0300,
        eWM_COPY = 0x0301,
        eWM_PASTE = 0x0302,
        eWM_CLEAR = 0x0303,
        eWM_UNDO = 0x0304,
        eWM_RENDERFORMAT = 0x0305,
        eWM_RENDERALLFORMATS = 0x0306,
        eWM_DESTROYCLIPBOARD = 0x0307,
        eWM_DRAWCLIPBOARD = 0x0308,
        eWM_PAINTCLIPBOARD = 0x0309,
        eWM_VSCROLLCLIPBOARD = 0x030A,
        eWM_SIZECLIPBOARD = 0x030B,
        eWM_ASKCBFORMATNAME = 0x030C,
        eWM_CHANGECBCHAIN = 0x030D,
        eWM_HSCROLLCLIPBOARD = 0x030E,
        eWM_QUERYNEWPALETTE = 0x030F,
        eWM_PALETTEISCHANGING = 0x0310,
        eWM_PALETTECHANGED = 0x0311,
        eWM_HOTKEY = 0x0312,
        eWM_PRINT = 0x0317,
        eWM_PRINTCLIENT = 0x0318,
        eWM_HANDHELDFIRST = 0x0358,
        eWM_HANDHELDLAST = 0x035F,
        eWM_AFXFIRST = 0x0360,
        eWM_AFXLAST = 0x037F,
        eWM_PENWINFIRST = 0x0380,
        eWM_PENWINLAST = 0x038F,
        eWM_APP = 0x8000,
        eWM_USER = 0x0400,
        eWM_REFLECT = eWM_USER + 0x1c00
    }

————————————————
Declaración de derechos de autor: Este artículo es un artículo original del blogger de CSDN "Mu Yu Ying Feng", siguiendo el acuerdo de copyright CC 4.0 BY-SA, adjunte el enlace original y vuelva a imprimir Esta declaración
Enlace original: https://blog.csdn.net/zhanddkk/article/details/51548335

17 artículos originales publicados · Me gusta 228 · Visita 330,000+

Supongo que te gusta

Origin blog.csdn.net/cxu123321/article/details/105475576
Recomendado
Clasificación