私の目標は、.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);
}