APIのメッセージボックス


なな  2011-06-04 15:58:30  No: 102947  IP: 192.*.*.*

こんにちは。
いつもお世話になっています。

APIのメッセージボックスはプログラムを止めないって聞いたことがあります。
タイマーでループしながら処理するプログラムを作っているんですが、処理を止めたくないので、APIのメッセージボックスを使いたいと思います。

それで、どうにかしてメッセージボックスをループの処理の中で閉じたいと思っています。

これって可能なのでしょうか?

ヒントだけでも教えてもらえないでしょうか。

宜しくお願いします。

VB6(SP6)、Win7です。

編集 削除
魔界の仮面弁士  2011-06-04 17:24:18  No: 102948  IP: 192.*.*.*

> それで、どうにかしてメッセージボックスをループの処理の中で閉じたいと思っています。

メッセージボックスに拘らず、Form で自作するようにしましょう。
そうすれば、Unload ステートメントや Hide メソッドが使えますよね。



> APIのメッセージボックスはプログラムを止めないって聞いたことがあります。

MessageBox API の事を仰っているのだとしたら、
MsgBox 関数と動作は一緒ですよ。

異なるのは、開発環境で実行した場合の動作と、
Unicode 文字の使用可否だけです。


' Timer1、Command1〜3、Label1 を貼っておいてください。
Option Explicit

Private Declare Function MessageBox _
    Lib "USER32" Alias "MessageBoxW" _
    (ByVal hWnd As OLE_HANDLE _
    , ByRef pszText As Byte _
    , ByRef pszCaption As Byte _
    , ByVal uType As VbMsgBoxStyle _
    ) As VbMsgBoxResult

Private NiHao As String

Private Sub Command1_Click()
    MsgBoxAPI "APIにて表示" & vbCrLf & NiHao, vbInformation
End Sub

Private Sub Command2_Click()
    MsgBox "標準関数で表示" & vbCrLf & NiHao, vbInformation
End Sub

Private Sub Command3_Click()
    MsgBox "標準関数で表示" & vbCrLf & NiHao, vbInformation
End Sub

Private Sub Timer1_Timer()
    Label1.Caption = Format(Now, "yyyy\/MM\/dd HH:mm:ss") _
        & Format(Timer - DateDiff("s", Date, Now), ".0000000")
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Timer1.Enabled = False
End Sub

Private Sub Form_Load()
    Timer1.Interval = 10

    NiHao = ChrW(&H4F60) & "好"

    Label1.Caption = "(タイマー)"
    Command1.Caption = "MessageBox API"
    Command2.Caption = "MsgBox/IDE"
    Command3.Caption = "MsgBox/EXE"
    If IsDebug() Then
        Command2.Enabled = True
        Command3.Enabled = False
    Else
        Command2.Enabled = False
        Command3.Enabled = True
    End If
    
    Timer1.Enabled = True
End Sub

Private Function MsgBoxAPI(ByVal sMessage As String _
    , Optional ByVal style As VbMsgBoxStyle = vbOKOnly _
    , Optional ByVal sCaption As String = vbNullString _
    ) As VbMsgBoxResult

    Dim msg() As Byte
    Dim cap() As Byte
    msg = sMessage & vbNullChar
    If sCaption = vbNullString Then
        cap = App.Title & vbNullChar
    Else
        cap = sCaption & vbNullChar
    End If
    Dim h As OLE_HANDLE
    If Not Screen.ActiveForm Is Nothing Then
        h = Screen.ActiveForm.hWnd
    End If
    MsgBoxAPI = MessageBox(h, msg(0), cap(0), style)
End Function

Private Function IsDebug() As Boolean
    On Error Resume Next
    Debug.Print 0 \ 0
    IsDebug = (Err.Number <> 0)
End Function

編集 削除