Pruebas con TextBox bajo vidrio DWM

Estoy tratando de lidiar con el color del texto de TextBox en DWM Glass. Leí mucho material, todavía no hay una solución perfecta.

El código de resultados casi perfecto que encontré aquí:http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/ , pero tiene muchas operaciones específicas de eventos y movimientos (por ejemplo: escriba un texto y presione el botón Inicio).

Estoy tratando de resolver esos problemas.

El siguiente código es una mutación del código original, pero no se basa en ningún evento, solo WM_PAINT. Todavía parpadea, y el cursor (cursor de texto) ¡desapareció de alguna manera!

¿Cómo evitar el parpadeo y cómo recuperar el cursor (cursor de texto)?

Gracias.

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.Diagnostics;

namespace AeroWindowsFormsApplication
{
    public class AeroTextBox : TextBox
    {
        private const int WM_PAINT = 0xf;

        private bool _aeroFix;

        public AeroTextBox()
        {
            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        }

        protected override void WndProc(ref Message m)
        {
            if (_aeroFix)
            {
                switch (m.Msg)
                {
                    case WM_PAINT:
                        RedrawAsBitmap();
                        m.Result = new IntPtr(1);
                        break;

                    default:
                        base.WndProc(ref m);
                        break;
                }
            }
            else
            {
                base.WndProc(ref m);
            }
        }

        private void RedrawAsBitmap()
        {
            using (Bitmap bm = new Bitmap(this.Width, this.Height))
            using (Graphics g = this.CreateGraphics())
            {
                this.DrawToBitmap(bm, this.ClientRectangle);
                g.DrawImageUnscaled(bm, -1, -1);
            }
        }

        public bool AeroFix
        {
            get { return _aeroFix; }
            set 
            {
                if (_aeroFix != value)
                {
                    Invalidate();
                }

                _aeroFix = value;
            }
        }
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta