private int GetCharIndexFromPos(int x, int y)
        {
            var p = new User32.POINTL {
                X = x, Y = y
            };
            int    rawSize = Marshal.SizeOf(typeof(User32.POINTL));
            IntPtr lParam  = Marshal.AllocHGlobal(rawSize);

            Marshal.StructureToPtr(p, lParam, false);
            int r = User32.SendMessage(this.Handle, (int)User32.Msgs.EM_CHARFROMPOS, 0, lParam);

            Marshal.FreeHGlobal(lParam);
            return(r);
        }
        private Point GetPosFromCharIndex(int ix)
        {
            int    rawSize = Marshal.SizeOf(typeof(User32.POINTL));
            IntPtr wParam  = Marshal.AllocHGlobal(rawSize);
            int    r       = User32.SendMessage(this.Handle, (int)User32.Msgs.EM_POSFROMCHAR, (int)wParam, ix);

            User32.POINTL p1 = (User32.POINTL)Marshal.PtrToStructure(wParam, typeof(User32.POINTL));

            Marshal.FreeHGlobal(wParam);
            var p = new Point {
                X = p1.X, Y = p1.Y
            };

            return(p);
        }