我的目标是在 .NET 2.0 中创建一个自定义 DateTimePicker 类,它显示自定义日历下拉菜单,而不是 Windows 默认日历弹出窗口。
通过观察 Windows 消息(见附件代码),我可以在创建后找到并隐藏/关闭日历窗口。
但是,问题仍然存在:日历窗口关闭后,仍然有东西挡住了鼠标输入。例如,如果您在以编程方式关闭日历下拉菜单(附加代码)后尝试最大化自定义 DateTimePicker 控件的所有者窗体,则最大化按钮不会响应。只有下一次点击有效。有趣的是,“非功能性点击”会触发 DTN_CLOSEUP 通知,因此 WM_CLOSE 似乎没有正确关闭日历。
任何关于如何完成我的任务的提示都非常感谢:)
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);
}