■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#617-3MsgBoxの閉じるのボタンを消す方法COSMO2003-08-28(木) 17:21
     #621-3RE#617:MsgBoxの閉じるのボタンを消す方法匿名6212003-08-28(木) 20:11
     #623-3RE#617:MsgBoxの閉じるのボタンを消す方法レベル112003-08-28(木) 21:25
     #631-3RE#621#623 :MsgBoxの閉じるのボタンを消す方法COSMO2003-08-29(金) 11:13
#617-3
MsgBoxの閉じるのボタンを消す方法
お世話になります。
メッセージボックスについての質問です。
Call MsgBox("テスト",vbOKOnly,"エラー")
とすると右上に閉じるのボタンが表示されます。
この閉じるボタンを消したい、またはEnabled=Falseにしたいのですが方法を教えてください。
ちなみに引数にvbYesNoか、vbAbortRetryIgnoreを渡すと閉じるボタンはEnabled=Falseになります。その他の引数ではEnabled=Falseになりません。
どうぞよろしくお願いします。
#621-3
RE#617:MsgBoxの閉じるのボタンを消す方法
> お世話になります。
> メッセージボックスについての質問です。
> Call MsgBox("テスト",vbOKOnly,"エラー")
> とすると右上に閉じるのボタンが表示されます。
> この閉じるボタンを消したい、またはEnabled=Falseにしたいのですが方法を教えてください。
> ちなみに引数にvbYesNoか、vbAbortRetryIgnoreを渡すと閉じるボタンは
> Enabled=Falseになります。その他の引数ではEnabled=Falseになりません。

MsgBoxを自作しましょう。
というか、OKOnlyなら、OK押しても×押しても結果は一緒なので、普通はこんなことやりませんが
#623-3
RE#617:MsgBoxの閉じるのボタンを消す方法
> Call MsgBox("テスト",vbOKOnly,"エラー")
> とすると右上に閉じるのボタンが表示されます。
> この閉じるボタンを消したい、またはEnabled=Falseにしたいのですが方法を教えてください。
> ちなみに引数にvbYesNoか、vbAbortRetryIgnoreを渡すと閉じるボタンはEnabled=Falseになります。
> その他の引数ではEnabled=Falseになりません。

MsgBoxをフックすれば可能ではありますが・・・・・・・普通は、まずやりません。
今回の議題に関わらず、MsgBoxのカスタマイズ系は大抵、FormでMsgBox様ウィンドウを作って
逃げてしまうのが一般的ですね。

ま、知的好奇心を満たすのが目的なら、以下のコードを動かしてみましょう。
FormにCommandButtonを一つ置いて下さい。
'【Formここから】---------------------------------------------------------------
Private Sub Command1_Click()
    Call CBTHook(Me.hwnd)
    MsgBox "テスト", vbOKOnly
End Sub
'【Formここまで】---------------------------------------------------------------

'【Basファイルここから】---------------------------------------------------------------
Option Explicit

'Window情報取得
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
        (ByVal hwnd As Long, _
         ByVal nIndex As Long) As Long
Private Const GWL_HINSTANCE     As Long = (-6)

'フック関連API
Private Declare Function UnhookWindowsHookEx Lib "user32" _
        (ByVal hHook As Long) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
        (ByVal idHook As Long, _
         ByVal lpfn As Long, _
         ByVal hmod As Long, _
         ByVal dwThreadId As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" _
        (ByVal hHook As Long, _
         ByVal ncode As Long, _
         ByVal wParam As Long, _
         lParam As Any) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Const WH_CBT            As Long = 5
Private Const HCBT_ACTIVATE     As Long = 5

'×ボタン制御関連API
Private Declare Function GetSystemMenu Lib "user32" _
        (ByVal hwnd As Long, _
         ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" _
        (ByVal hMenu As Long, _
         ByVal nPosition As Long, _
         ByVal wFlags As Long) As Long
Public Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Public Const SC_CLOSE = &HF060
Public Const MF_BYCOMMAND = &H0&

Private hHook   As Long

Public Sub CBTHook(phwnd As Long)
    Dim hInst       As Long
    Dim lngTID      As Long
    On Error Resume Next

    hInst = GetWindowLong(phwnd, GWL_HINSTANCE)
    lngTID = GetCurrentThreadId()

    'CBTフック インストール
    hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, hInst, lngTID)
End Sub

Private Function HookProc(ByVal ncode As Long, _
                          ByVal wParam As Long, _
                          ByVal lParam As Long) As Long
    On Error GoTo ErrorHandler

    If ncode = HCBT_ACTIVATE Then
        '×ボタン制御
        Call DeleteMenuFunc(wParam)
        'CBTフック アンインストール
        Call UnhookWindowsHookEx(hHook)
    End If
    'フック関数の継続を中止
    HookProc = False
Exit Function
ErrorHandler:
    '現在のフックチェイン中の次のフックプロシージャに、フック情報を渡す。
    Call CallNextHookEx(hHook, ncode, wParam, lParam)
    'CBTフック アンインストール
    Call UnhookWindowsHookEx(hHook)
End Function

'×ボタン制御
Private Sub DeleteMenuFunc(lHandle As Long)
    Dim hMen As Long

    hMen = GetSystemMenu(lHandle, 0)
    Call DeleteMenu(hMen, SC_CLOSE, MF_BYCOMMAND)
    Call DeleteMenu(hMen, 0, MF_BYCOMMAND)
    Call DrawMenuBar(lHandle)
End Sub
'【Basファイルここまで】---------------------------------------------------------------

#以上のコードを見れば、Formで自作した方が速くて安全なのが判るかと思います。

#でも、vbOKOnlyなら、×押してもOKボタン押しても結果は同じなのですが、
#どうして×を無効にする必要があるのでしょう・・・・・
#631-3
RE#621#623 :MsgBoxの閉じるのボタンを消す方法
レベル11様、匿名621様ご回答ありがとうございます。

レベル11様の方法を試してみましたらEnabled=Falseなりました。
こんな方法があるんですね。ありがとうございます。

しかし、実用段階での話しになりますと自作が安全ですね。
自分もこんなことはやらなくてもいいと思うのですが、なんせ
仕様なものですから...

ありがとうございました。

.........
> MsgBoxを自作しましょう。
> というか、OKOnlyなら、OK押しても×押しても結果は一緒なので、普通はこんなことやりませんが

.........
#でも、vbOKOnlyなら、×押してもOKボタン押しても結果は同じなのですが、
#どうして×を無効にする必要があるのでしょう・・・・・
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)