DTN_DATETIMECHANGE 通知メッセージをキャッチするといいかもしれません。
C#
1using System;
2using System.Windows.Forms;
3using System.Runtime.InteropServices;
4
5class TimePicker : DateTimePicker
6{
7 public TimePicker() {
8 base.Format = DateTimePickerFormat.Custom;
9 base.CustomFormat = "yyyy/MM/dd hh:mm:ss";
10 }
11
12 protected override void WndProc(ref Message m) {
13 switch (m.Msg) {
14 case WM_REFLECT + WM_NOTIFY:
15 WmReflectCommand(ref m);
16 break;
17 default:
18 base.WndProc(ref m);
19 break;
20 }
21 }
22
23 private void WmReflectCommand(ref Message m) {
24 if (m.HWnd == Handle) {
25 NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR));
26 switch (nmhdr.code) {
27 case DTN_DATETIMECHANGE:
28 WmDateTimeChange(ref m);
29 break;
30 default:
31 base.WndProc(ref m);
32 break;
33 }
34 } else {
35 base.WndProc(ref m);
36 }
37 }
38
39 private void WmDateTimeChange(ref Message m) {
40 NMDATETIMECHANGE nmdtc = (NMDATETIMECHANGE)m.GetLParam(typeof(NMDATETIMECHANGE));
41 if (nmdtc.dwFlags != GDT_NONE) {
42 DateTime oldValue = base.Value;
43 DateTime newValue = SysTimeToDateTime(nmdtc.st);
44 if (oldValue.Second == 59 && newValue.Second == 00) {
45 base.Value = newValue.AddMinutes(+1);
46 return;
47 } else if (oldValue.Second == 00 && newValue.Second == 59) {
48 base.Value = newValue.AddMinutes(-1);
49 return;
50 }
51 base.WndProc(ref m);
52 } else {
53 base.WndProc(ref m);
54 }
55 }
56
57 private static DateTime SysTimeToDateTime(SYSTEMTIME s) {
58 return new DateTime(s.wYear, s.wMonth, s.wDay, s.wHour, s.wMinute, s.wSecond, s.wMilliseconds);
59 }
60
61 private const int
62 WM_USER = 0x0400,
63 WM_REFLECT = WM_USER + 0x1C00,
64 WM_NOTIFY = 0x004E,
65 GDT_NONE = 1,
66 DTN_DATETIMECHANGE = ((0 - 760) + 1);
67
68 [StructLayout(LayoutKind.Sequential)]
69 private struct NMHDR
70 {
71 public IntPtr hwndFrom;
72 public IntPtr idFrom;
73 public int code;
74 }
75
76 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
77 private class NMDATETIMECHANGE
78 {
79 public NMHDR nmhdr;
80 public int dwFlags = 0;
81 public SYSTEMTIME st = null;
82 }
83
84 [StructLayout(LayoutKind.Sequential)]
85 private class SYSTEMTIME
86 {
87 public short wYear;
88 public short wMonth;
89 public short wDayOfWeek;
90 public short wDay;
91 public short wHour;
92 public short wMinute;
93 public short wSecond;
94 public short wMilliseconds;
95 }
96}