Changes between Version 5 and Version 6 of Windows的な問題


Ignore:
Timestamp:
Jul 7, 2005, 2:40:55 AM (19 years ago)
Author:
rryu
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Windows的な問題

    v5 v6  
    11= Windows的な問題 =
    22
    3 == Alt+F4対策を行うとシャットダウンできなくなる ==
    4 
    5 Windows自身の仕様なのかSystem.Windows.Formsの問題なのかは謎ですが、ウインドウのコントロールボックスとクローズボタンを非表示にしただけではユーザーがウインドウを閉じてしまうことを防ぐことができません。システムメニューが表示されないにもかかわらず、Alt+F4というキー操作は依然として有効だからです。
    6 
    7 Alt+F4によるウインドウのクローズ操作に対抗するには、System.Windows.Forms.Form.Closingイベントを捕捉してクローズをキャンセルするしかありません。が、今度はシャットダウンができなくなるという問題が発生します。おそらくどんなときでもクローズをキャンセルしてしまうからでしょう。そこで今度はMicrosoft.Win32.SystemEvents.SessionEndingイベントを捕捉して、シャットダウンを検出して、そこで強制クローズフラグを立てるということを行うことで、シャットダウン時だけは閉じれるようにします。
    8 
    9 これでうまくいきそうに思えますが、実は駄目です。その秘密はここにあるようです。
    10 
    11 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfmicrosoftwin32systemeventsclasssessionendingtopic.asp
    12 
    13   "''Windows フォームでシステムのログオフまたは再起動を検出するために SessionEnding を使用している場合、このイベントの前に System.Windows.Forms.Form.Closing イベントが発生するかどうかを確実に知ることはできません。''"
    14 
    15 そもそもWindowsのメッセージはすべてウインドウに対して送られます。したがって Microsoft.Win32.SystemEvents.SessionEnding イベントを発生させるために、誰かが別途定めるウインドウを使用してWM_QUERYENDSESSIONを捕捉しているはずです。そのウインドウは System.Windows.Forms.Form.Closing イベントを処理しているウインドウとは異なるため、この2つのイベントの発生順について何も保障はありません。だからうまく行かないわけです。
    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 
     3スレ立てるまでも無い問題はここに。