- 題名: フォーム右上の閉じるボタン
- 日時: 2003/08/15 14:18:59
- ID: 334
- この記事の返信元:
- (なし)
- この記事への返信:
- [342] Re[1]: フォーム右上の閉じるボタン2003/08/16 20:10:48
- [343] Re[1]: フォーム右上の閉じるボタン2003/08/17 2:34:23
- ツリーを表示
こんばんは、てつ☆ミさん。ピラルクです。 [X]ボタンのイベントを直接捕らえるのは無理のようなので、 それ以外のForm.Closingを呼ぶ元となるイベントと協調して Form.Closingで識別することはかろうじて可能のようです。 (開発環境の■ボタンは強制KillなのでClosingが来ない) (補)このような識別が必要になるというような状態は、 別のところに直すべき問題があると思われ、以下 のようなトリッキーとも言える実装を試みること はおすすめしません。 '--------+---------+---------+---------*---------+---------+---------+---- '[X]ボタンでは閉じれないForm '--------+---------+---------+---------*---------+---------+---------+---- Public Class Form1 Inherits System.Windows.Forms.Form Implements IMessageFilter ... Private Const WM_CLOSE = &H10 Private Const WM_NCLBUTTONDOWN = &HA1 Private Const WM_NCMOUSEMOVE = &HA0 Private Const WM_SYSCOMMAND = &H112 Private Const SC_CLOSE = &HF060& Private m_Closable As Boolean = True Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Application.AddMessageFilter(Me) End Sub Private Sub Form1_Closing(ByVal sender As Object, _ ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing If Not m_Closable Then '[X]ボタンで閉じられかけている場合 e.Cancel = True End If End Sub Private Sub btnClose_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnClose.Click '閉じるボタンは常に閉じることが可能 m_Closable = True Close() End Sub Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) _ As Boolean Implements IMessageFilter.PreFilterMessage If m.Msg = WM_NCLBUTTONDOWN Then '[X]の可能性あり m_Closable = False ElseIf m.Msg = WM_SYSCOMMAND And m.WParam.ToInt32 = SC_CLOSE Then 'コントロールBOX(タスクバー含む)の[閉じる]あるいは"Alt+F4" m_Closable = True ElseIf m.Msg = WM_CLOSE Then 'タスクマネージャでKillされる m_Closable = True End If Return False End Function End Class # なんか抜け道ありそう...
Form.Closingイベントでフォーム上の右上の閉じる(×)ボタンが押されたか否かを判断するにはどのようにすればよろしいのでしょうか?
ご教授ください。
よろしくお願いします。