Changes between Version 4 and Version 5 of Windows的な問題
- Timestamp:
- Jul 5, 2005, 9:49:38 PM (19 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Windows的な問題
v4 v5 13 13 "''Windows フォームでシステムのログオフまたは再起動を検出するために SessionEnding を使用している場合、このイベントの前に System.Windows.Forms.Form.Closing イベントが発生するかどうかを確実に知ることはできません。''" 14 14 15 この問題の対処方法として、WndProc()でWM_QUERYENDSESSIONイベントを捕捉して、そこでフラグを立てるという方法が紹介されています。これでうまく行くという事は、少なくともWindows的にはウインドウを閉じようとする前に確実にWM_QUERYENDSESSIONイベントが飛んできているということになります。そもそも誰がウインドウを閉じようとしているのか。全く謎です。15 そもそもWindowsのメッセージはすべてウインドウに対して送られます。したがって Microsoft.Win32.SystemEvents.SessionEnding イベントを発生させるために、誰かが別途定めるウインドウを使用してWM_QUERYENDSESSIONを捕捉しているはずです。そのウインドウは System.Windows.Forms.Form.Closing イベントを処理しているウインドウとは異なるため、この2つのイベントの発生順について何も保障はありません。だからうまく行かないわけです。 16 16 17 この問題に対処するには System.Windows.Forms.Form.Closing イベントを処理しているウインドウでWM_QUERYENDSESSIONを捕捉する必要があります。これがそこで紹介されている対処方法というわけです。 18 19 ちなみになぜかアプリケーションの終了はできるという謎の現象は、こういう理由からだったようです。 20 21 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsformclassclosingtopic.asp 22 23 "''注意 Application.Exit メソッドが呼び出されてアプリケーションを終了する場合、 Form.Closed イベントと Form.Closing イベントは発生しません。これらのイベントのいずれかに実行する必要がある検証コードがある場合は、 Exit メソッドを呼び出す前に、開いている各フォームに対して Form.Close メソッドを個別に呼び出す必要があります。''" 24