MonthCalendar の恐怖体験、この現象がなぜ起こるのか? というコメントをいただきましたので、調査をしてみました。

 まずどのような現象が発生していたかと言うと、MonthCalendar の前月・翌月どちらかのボタンを選択してメッセージボックスの OK ボタンを選択すると MonthCalendar.DateChanged イベント が常に発生するようになります。そのため、メッセージボックスがブラクラのようにポンポンポンポン表示されてしまうという現象が発生します。

 調査の結果ですが、元々 MonthCalendar の前月・翌月ボタンをマウスで押しっぱなし状態にしていると一定間隔で前月・翌月ボタンが選択された動作をします。前月・翌月ボタンをマウスで押して MonthCalendar.DateChanged イベントでメッセージボックスを表示すると、マウスが離されていない(押しっぱなしになっている)と勘違いしているようなのです。そのため、メッセージボックスを閉じた後に絶えず一定間隔で前月・翌月ボタンが選択されてしまい、今回の現象が発生したようなのです。

 調査内容として Spy++ を使用してその時の MonthCalendar の Windows メッセージを見てみました。そしたら次のようなメッセージが飛んできていました。

Spy++ で見た MonthCalendar へのメッセージ
  • WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:8 yPos:19 ' 前月ボタンでマウスダウン
  • ・・・
  • WM_LBUTTONUP fwKeys:0000 xPos:-1 yPos:-1
  • ' マウスアップされているように見えるが実際はされていない
  • ・・・
  • ・・・ ' メッセージボックスが表示され OK ボタンを選択
  • ・・・
  • WM_TIMER wTimerID:1 tmprc:00000000 ' MonthCalendar.DateChanged イベントが発生する
  • WM_TIMER wTimerID:1 tmprc:00000000 ' マウスアップされていない事になっているため常に繰り返し

 MSDN にも注意書きがされていないため注意が必要ですね。またこの他にも MonthCalendar には怪現象があるようです。「MonthCalendar で予期せぬ DateChanged イベントが発生する」これは 2 ~ 3 分間放置するといきなり MonthCalendar.DateChanged イベントが発生するというのです。これはポルターガイスト現象ですよ。MonthCalendar は呪われていますよきっと。