Zeigen Sie ein benutzerdefiniertes Kalender-Dropdown-Menü mit einer abgeleiteten DateTimePicker-Klasse an

Mein Ziel ist es, eine benutzerdefinierte DateTimePicker-Klasse in .NET 2.0 zu erstellen, die anstelle des Windows-Standardkalender-Popups ein benutzerdefiniertes Kalender-Dropdown-Menü anzeigt.

Durch Beobachten von Windows-Meldungen (siehe angehängten Code) kann ich das Kalenderfenster nach der Erstellung suchen und ausblenden / schließen.

Es bleibt jedoch ein Problem: Nach dem Schließen des Kalenderfensters blockiert immer noch etwas die Mauseingabe. Wenn Sie beispielsweise versuchen, das Besitzerformular des angepassten DateTimePicker-Steuerelements zu maximieren, nachdem das Kalender-Dropdown-Menü programmgesteuert geschlossen wurde (angehängter Code), reagiert die Schaltfläche zum Maximieren nicht. Nur der nächste Klick funktioniert. Interessanterweise löst der "nicht funktionierende Klick" die DTN_CLOSEUP-Benachrichtigung aus, sodass der WM_CLOSE den Kalender anscheinend nicht ordnungsgemäß geschlossen hat.

Hinweise, wie ich meine Aufgabe erfüllen kann, sind sehr willkommen :)

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if (m.Msg == (int)SYSMSG.WM_REFLECT + (int)SYSMSG.WM_NOTIFY)
    {
        NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR));
        switch (nmhdr.code)
        {
            case DTN_DROPDOWN:
                // Hide window
                IntPtr calHandle = FindWindow("SysMonthCal32", null);
                SendMessage(calHandle, (int)SYSMSG.WM_SIZE, 0, SP.Convert.MakeLong(0, 0));

                this.BeginInvoke((MethodInvoker)delegate()
                {
                    SendMessage(calHandle, (int)SYSMSG.WM_CLOSE, 0, 0);
                });
                break;
        }

    }

    base.WndProc(ref m);
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage