DOBON.NET どぼん!のVB道掲示板(プログラム)過去ログ

フォームのXボタンの制御

はじめまして。

フォームの右上のXボタンの制御に関して困っております。
Private Sub Form1_Closing(ByVal eventSender As System.Object _
, ByVal eventArgs As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
  eventArgs.Cancel = True
  Me.WindowState = FormWindowState.Minimized
End Sub
上記のコードではXボタンを押下した時無効に出来ますが
ログオフ、シャットダウンの時も終了できない状態になります。

Xボタンは無効にしログオフ、シャットダウン時はフォームを終了したいのですが
どのような方法があるのでしょうか?
よろしくお願いします。
>フォームの右上のXボタンの制御に関して困っております。
>Private Sub Form1_Closing(ByVal eventSender As System.Object _
> , ByVal eventArgs As System.ComponentModel.CancelEventArgs) _
> Handles MyBase.Closing
>  eventArgs.Cancel = True
>  Me.WindowState = FormWindowState.Minimized
>End Sub
>上記のコードではXボタンを押下した時無効に出来ますが
>ログオフ、シャットダウンの時も終了できない状態になります。
>
>Xボタンは無効にしログオフ、シャットダウン時はフォームを終了したいのですが
>どのような方法があるのでしょうか?

Xボタンを無効にして押せなくするにはAPIを使うしかなさそうです。

フォームが閉じようとしているときにその原因を知りたいということであれば(VB6のQueryUnloadイベントにおけるUnloadModeのように)、ちょっと難しいようですが、それでもいろいろな方法があるようです。

まず、GotDotNetにStackFrameをつかった方法がありました。
http://www.gotdotnet.com/Community/MessageBoard/Thread.aspx?id=40651

また、次のページの「Determine a Form's UnloadMode」にhidden windowを使った方法がありました。
http://www.fawcette.com/Archives/premier/mgznarch/vbpj/2001/11nov01/qa0111/qa0111.asp

最後にZDNet AustraliaにWndProcを使った方法がありました。
http://www.zdnet.com.au/builder/program/windows/story/0,2000035027,20271637,00.htm
レスありがとうございます。

英語だ〜
語学力に乏しい私には苦しい

StackFrameなんて方法があるんですね。
StackTraceクラスが何なのかHELPを見てもわからない・・・
こんな方法どうやって見つけたんだ?

WndProcのWM_ENDSESSIONメッセージで処理する方法は
私の環境ではClosingイベント後発生するのでログオフがキャンセルされてしまいます。
プログラムは終了するのですが・・・
(環境:W2KSP3)
結局、私がやった方法はWndProcでWM_SYSCOMMANDメッセージ&SC_CLOSEで行いました。

話は変わりますがメルマガ届きました。
APIビューアはやっぱり外せませんね。
今回WndProcを使用したのですが、そのメッセージのID番号や定数・意味など
調べる方法を教えていただけると助かります。
遅くなってすみません。

>英語だ〜
>語学力に乏しい私には苦しい

私ほどではないと思いますよ。私の英語に対する憎しみの強さといったらないですから。それでもこのようなことは英語のサイトを調べないと見つからないんですよね。

>StackFrameなんて方法があるんですね。
>StackTraceクラスが何なのかHELPを見てもわからない・・・
>こんな方法どうやって見つけたんだ?

私にもさっぱり分かりません。本当に完璧にうまくいくならすごいですよね。

>WndProcのWM_ENDSESSIONメッセージで処理する方法は
>私の環境ではClosingイベント後発生するのでログオフがキャンセルされてしまいます。
>プログラムは終了するのですが・・・
>(環境:W2KSP3)
>結局、私がやった方法はWndProcでWM_SYSCOMMANDメッセージ&SC_CLOSEで行いました。

なるほど、そうでしたか。勉強になりました。

>話は変わりますがメルマガ届きました。
>APIビューアはやっぱり外せませんね。

本当にどうしてなくなってしまったのか不思議ですよね。皆さんはどうしているのでしょうか?

>今回WndProcを使用したのですが、そのメッセージのID番号や定数・意味など
>調べる方法を教えていただけると助かります。

やはりSpy++を使うというのが基本なのでしょうか。
ちょっと調べてみたところ、ウィンドウメッセージがたくさん紹介されているサイトがありましたので紹介させていただきます。日本語ですし。

WinAPI Data for VB Programmer
http://www.geocities.co.jp/SiliconValley-Cupertino/5872/

DOBON.NET | プログラミング道 | プログラミング掲示板