ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 05:34

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 8 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年10月19日(水) 17:17 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
前回、「ムービー ファイル再生用のウィンドウ」で質問したプログラムなのですが、
Audio / Video File を再生して、再生を終了すると、普通「MciNotify」のコードで止まりますが、
僕が作ったものだと、デバイスを閉じるコードを記述してあるのに止まりません。

コードを載せておきますので、何処がいけないのか(どう修正すればいいのか)教えて下さい。

コード:
'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'CD Player,MCI Audio==================================================
Const ID_TIMER = 100

'MCI_OPEN_PARMS構造体。MCIデバイスのオープンに関する情報が格納される
Dim mop As MCI_OPEN_PARMS

'現在演奏中のトラック番号(1,2,3,...)が格納される
Dim TrackNum As Long


Function OpenMciDevice() As Long
    'MCIデバイスをオープンする
    '(mop.wDeviceIDにデバイスIDが格納される)

    Dim dwError As DWord
    Dim buffer[255] As Byte

    mop.dwCallback=hMainWnd
    mop.lpstrDeviceType="cdaudio"
    dwError=mciSendCommand(0,MCI_OPEN,MCI_WAIT or MCI_OPEN_TYPE,mop)
    If dwError Then
        mciGetErrorString(dwError,buffer,255)
        MessageBox(hMainWnd,buffer,"Missed to open of device.",MB_OK)
        OpenMciDevice=0
    Else
        OpenMciDevice=1
    End If
End Function

Sub CloseMciDevice()
    'MCIデバイスを閉じる
    Dim dwDummy As DWord
    mciSendCommand(mop.wDeviceID,MCI_CLOSE,MCI_WAIT,dwDummy)
    mop.wDeviceID=0
End Sub

Sub GetTrackInfo()
    Dim dwError As DWord
    Dim buffer[255] As Byte
    Dim NumberOfTracks As Long

    If mop.wDeviceID Then
        '再生中のときは停止
        SendMessage(hMainWnd,WM_COMMAND,CDStopButton,0)
    End If

    'MCIデバイスをオープン
    If OpenMciDevice()=0 Then Exit Sub

    'トラック数を取得(取得したトラック数はNumberOfTracks変数にコピーする)
    Dim msp As MCI_STATUS_PARMS
    msp.dwItem=MCI_STATUS_NUMBER_OF_TRACKS
    dwError=mciSendCommand(mop.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,msp)
    If dwError Then
        mciGetErrorString(dwError,buffer,255)
        MessageBox(hMainWnd,buffer,"Missed to get of tracks info.",MB_OK)

        'MCIデバイスを閉じる
        CloseMciDevice()
        Exit Sub
    End If
    NumberOfTracks=msp.dwReturn


    '--------------------------------------
    ' リストボックスにトラック情報をセット
    '--------------------------------------
    Dim i As Long
    Dim hList As DWord
    hList=GetDlgItem(hMainWnd,TrackList)

    '時刻形式にMFSを指定
    Dim msep As MCI_SET_PARMS
    msep.dwTimeFormat = MCI_FORMAT_MSF
    mciSendCommand(mop.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,msep)

    'リストボックスの内容をリセット
    SendMessage(hList,LB_RESETCONTENT,0,0)

    For i=1 To NumberOfTracks
        'トラック情報を取得する
        msp.dwItem=MCI_STATUS_LENGTH
        msp.dwTrack=i
        mciSendCommand(mop.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM or MCI_TRACK,msp)

        'トラック情報を文字列に変換
        wsprintf(buffer,"Track%02d - %02d:%02d",i,MCI_MSF_MINUTE(msp.dwReturn),MCI_MSF_SECOND(msp.dwReturn))

        'リストボックスに追加
        SendMessage(hList,LB_ADDSTRING,0,buffer)
    Next


    'MCIデバイスを閉じる
    CloseMciDevice()

    '再生ボタンを有効化し、一時停止・停止ボタンを無効化する
    EnableWindow(GetDlgItem(hMainWnd,CDPlayButton),1)
    EnableWindow(GetDlgItem(hMainWnd,CDPauseButton),0)
    EnableWindow(GetDlgItem(hMainWnd,CDStopButton),0)
End Sub
'=====================================================================

Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (lpstrCommand As BytePtr,lpstrReturnString As BytePtr,uReturnLength As DWord,hwndCallback As DWord) As DWord

declare function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes as VoidPtr, bInitialOwner as long, lpName as String) as long

declare function timeSetEvent Lib "winmm" (uDelay as DWord,uResolution as DWord,lpTimeProc as DWord,dwUser as DWordPtr,fuEvent as DWord) as DWord
declare function timeKillEvent Lib "winmm" (uTimerID as DWord) as DWord
dim uTimer as DWord

'SetWndCenter Function================================================
function SetWndCenter(hWnd as long,ByRef cpos as POINTAPI) as long
	dim AppWnd as RECT
	dim width as long,hight as long

	GetWindowRect(hWnd,AppWnd)

	with AppWnd
		width=(.right - .left)
		hight=(.bottom - .top)

		.left=cpos.x - width/2
		.top=cpos.y - hight/2

		if .left<0 then .left=0
		if .top<0 then .top=0

		SetWndCenter=MoveWindow(hWnd,.left,.top,width,hight,TRUE)
	End With
End Function
dim DeskTopCenter as POINTAPI
'=====================================================================

'Status Bar===========================================================
const ID_STATUS = 70
dim hStatusWnd as DWord
'=====================================================================

'MCI Video============================================================
Dim vop As MCI_DGV_OPEN_PARMS
Dim vpp AS MCI_DGV_PLAY_PARMS
Dim msp As MCI_SEEK_PARMS
Dim buffer[100] As Byte
Dim bErr As Long
Dim d As Long
d=0

Type MCI_DGV_OPEN_PARMS
dwCallback As DWord
wDeviceID As DWord
lpstrDeviceType As BytePtr
lpstrElementName As BytePtr
lpstrAlias As BytePtr
dwStyle As DWord
hWndParent As DWord
End Type

TYPE MCI_DGV_PLAY_PARMS
dwCallback As DWord 
dwFrom As DWord 
dwTo As DWord
dwSpeed As DWord
End Type

Type MCI_DGV_RECT_PARMS
    dwCallback As DWord
    ptOffset As POINTAPI
    ptExtent As POINTAPI
End Type
'=====================================================================
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
	dim mmi as *MINMAXINFO
	
	select case dwMsg
		case WM_GETMINMAXINFO
			mmi=lParam
			mmi->ptMinTrackSize.x=408
			mmi->ptMinTrackSize.y=440
			mmi->ptMaxTrackSize.x=408
			mmi->ptMaxTrackSize.y=440
	End Select
	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function

function TimeProc(uID as DWord,uMsg as DWord,dwUser as DWord,dw1 as DWord,dw2 as DWord) as DWord
	uTimerID=timeSetEvent(100,0,AddressOf(TimeProc),0,1)

	timeKillEvent(uTimerID)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
	dim IsTopMost as long
	if SendMessage(GetDlgItem(hMainWnd,CheckBox1),BM_GETCHECK,0,0) then
		IsTopMost=1
	Else
		IsTopMost=0
	End If
	
	MCIPlayer_DestroyObjects()
	PostQuitMessage(0)
End Sub

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
    GetTrackInfo()


	Dim rect As RECT

	SystemParametersInfo(SPI_GETWORKAREA,0,VarPtr(rect),0)

	With DeskTopCenter
		.x = (rect.left + rect.right)/2
		.y = (rect.top + rect.bottom)/2
			Dim buf As String
			buf=ZeroString(40)
			wsprintf(buf,"xc=%4d, yc=%4d", .x, .y)
	End With

	If SetWndCenter(hMainWnd, DeskTopCenter) = FALSE Then
		MessageBox(hMainWnd,"Missed to move.","erorr",MB_OK)
	End If

	dim IsTopMost as long
	
	if IsTopMost then
		SendDlgItemMessage(hMainWnd,CheckBox1,BM_SETCHECK,BST_CHECKED,0)
		SetWindowPos(hMainWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE)
	End If


	dim ic as INITCOMMONCONTROLSEX
	dim Statusbar_Sizes[1] as long

	ic.dwSize=Len(ic)
	ic.dwICC=ICC_BAR_CLASSES
	InitCommonControlsEx(ic)

	hStatusWnd=CreateStatusWindow(WS_CHILD or WS_VISIBLE or CCS_BOTTOM,_
								  NULL,hMainWnd,ID_STATUS)

	Statusbar_Sizes[0]=204
	Statusbar_Sizes[1]=408
	SendMessage(hStatusWnd,SB_SETPARTS,2,Statusbar_Sizes)

	SetTimer(hMainWnd,0,1,NULL)
End Sub

Sub MainWnd_ReloadButton_Click()
    GetTrackInfo()

	SetWindowText(hMainWnd,"MCI Player")
End Sub

Sub MainWnd_EjectButton_Click()
    If mop.wDeviceID Then
        SendMessage(hMainWnd,WM_COMMAND,CDStopButton,0)
    End If

    If OpenMciDevice()=0 Then Exit Sub

    mciSendCommand(mop.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, ByVal NULL)

    CloseMciDevice()

    EnableWindow(GetDlgItem(hMainWnd,CDPlayButton),0)
    EnableWindow(GetDlgItem(hMainWnd,CDPauseButton),0)
    EnableWindow(GetDlgItem(hMainWnd,CDStopButton),0)
End Sub

Sub MainWnd_CDPlayButton_Click()
	SetWindowText(hMainWnd,"You pushed play button of Audio CD.")

    Dim dwError As DWord
    Dim buffer[255] As Byte
    Dim msep As MCI_SET_PARMS
    Dim mpp As MCI_PLAY_PARMS
    Dim dwParms As DWord

    If mop.wDeviceID=0 Then

        TrackNum=SendDlgItemMessage(hMainWnd,TrackList,LB_GETCURSEL,0,0)
        If TrackNum=LB_ERR Then Exit Sub
   	    TrackNum=TrackNum+1

        If OpenMciDevice()=0 Then Exit Sub

        msep.dwTimeFormat = MCI_FORMAT_MSF
        mciSendCommand(mop.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,msep)

        Dim msp As MCI_STATUS_PARMS
        msp.dwItem=MCI_STATUS_LENGTH
        msp.dwTrack=TrackNum
        mciSendCommand(mop.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM or MCI_TRACK,msp)

        Dim nMax As Integer
        Dim hTrackBar As DWord
        hTrackBar=GetDlgItem(hMainWnd,TrackBar1)
        nMax=(MCI_MSF_MINUTE(msp.dwReturn)*60 + MCI_MSF_SECOND(msp.dwReturn)) * 10
        SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,nMax))
        SendMessage(hTrackBar,TBM_SETPOS,1,0)


        msep.dwTimeFormat = MCI_FORMAT_TMSF
        mciSendCommand(mop.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,msep)

		mpp.dwCallback=hMainWnd
        mpp.dwFrom=MCI_MAKE_TMSF(TrackNum,0,0,0)
        if TrackNum=SendDlgItemMessage(hMainWnd,TrackList,LB_GETCOUNT,0,0) then
            dwParms=MCI_FROM or MCI_NOTIFY

			dim ReturnString[1024] As Byte

			mciSendString("open cdaudio alias cda",ReturnString,1024,NULL)
			mciSendString("set cda time format tmsf",ReturnString,1024,NULL)
			mciSendString("play cda from SelectedTrack to LastTrack",ReturnString,1024,NULL)
		Else
	     	mpp.dwTo=MCI_MAKE_TMSF(TrackNum+1,0,0,0)
            dwParms=MCI_FROM or MCI_TO or MCI_NOTIFY

			mciSendString("stop cda",ReturnString,1024,NULL)
			mciSendString("close cda",ReturnString,1024,NULL)
        End If

	    dwError=mciSendCommand(mop.wDeviceID,MCI_PLAY,dwParms,mpp)
    Else

        mpp.dwCallback=hMainWnd
        If TrackNum=SendDlgItemMessage(hMainWnd,TrackList,LB_GETCOUNT,0,0) Then
            dwParms=MCI_NOTIFY
        Else
            mpp.dwTo=MCI_MAKE_TMSF(TrackNum+1,0,0,0)
            dwParms=MCI_TO or MCI_NOTIFY
        End If
        dwError=mciSendCommand(mop.wDeviceID,MCI_PLAY,dwParms,mpp)
    End If

    If dwError Then
        mciGetErrorString(dwError,buffer,255)
        MessageBox(hMainWnd,buffer,"Missed to play of device.",MB_OK)

        CloseMciDevice()
        Exit Sub
    End If

    EnableWindow(GetDlgItem(hMainWnd,CDPlayButton),0)
    EnableWindow(GetDlgItem(hMainWnd,CDPauseButton),1)
    EnableWindow(GetDlgItem(hMainWnd,CDStopButton),1)

    SetTimer(hMainWnd,ID_TIMER,1,0)

	SetWindowText(hMainWnd,"MCI Player")
End Sub

Sub MainWnd_CDPauseButton_Click()
    mciSendCommand(mop.wDeviceID,MCI_PAUSE,0,ByVal 0)

    EnableWindow(GetDlgItem(hMainWnd,CDPlayButton),1)
    EnableWindow(GetDlgItem(hMainWnd,CDPauseButton),0)
    EnableWindow(GetDlgItem(hMainWnd,CDStopButton),1)

	SetWindowText(hMainWnd,"Audio CD is pausing now.")

    KillTimer(hMainWnd,ID_TIMER)
End Sub

Sub MainWnd_CDStopButton_Click()
	SetWindowText(hMainWnd,"You pushed stop button of Audio CD")

    Dim bErr As Long
    Dim dwCallback As DWord

    bErr=mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_WAIT,dwCallback)
    If bErr Then
        MessageBox(hMainWnd,"Missed to stop of device.","error",MB_OK)
        Exit Sub
    End If

    CloseMciDevice()

    EnableWindow(GetDlgItem(hMainWnd,CDPlayButton),1)
    EnableWindow(GetDlgItem(hMainWnd,CDPauseButton),0)
    EnableWindow(GetDlgItem(hMainWnd,CDStopButton),0)

    KillTimer(hMainWnd,ID_TIMER)

    SendMessage(GetDlgItem(hMainWnd,TrackBar1),TBM_SETPOS,1,0)

	SetWindowText(hMainWnd,"MCI Player")
End Sub

Sub MainWnd_MciNotify(flags As Long, DevID As Long)
    If flags=MCI_NOTIFY_SUCCESSFUL Then
        SendMessage(hMainWnd,WM_COMMAND,CDStopButton,0)
	End If

	if flags=MCI_NOTIFY_SUCCESSFUL Then
	    Dim dwCallback As DWord

        mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback)

        mop.wDeviceID=0

		bErr=mciSendCommand(vop.wDeviceID,MCI_STOP,0,d) 
	End If
End Sub

Sub MainWnd_HScroll(nScrollCode As Long, nPos As Integer, hwndScrollBar As Long)
    Dim sw As Long

    If mop.wDeviceID<>0 and _
        hwndScrollBar=GetDlgItem(hMainWnd,TrackBar1) and _
        (nScrollCode=SB_ENDSCROLL or _
        nScrollCode=SB_LEFT or _
        nScrollCode=SB_RIGHT or _
        nScrollCode=SB_LINELEFT or _
        nScrollCode=SB_LINERIGHT or _
        nScrollCode=SB_PAGELEFT or _
        nScrollCode=SB_PAGERIGHT or _
        nScrollCode=SB_THUMBPOSITION)Then

        If IsWindowEnabled(GetDlgItem(hMainWnd,CDPlayButton))=0 Then
            SendMessage(hMainWnd,WM_COMMAND,CDPauseButton,0)

            sw=1
        Else
            sw=0
        End If

        Dim msep As MCI_SET_PARMS
        msep.dwTimeFormat = MCI_FORMAT_TMSF
        mciSendCommand(mop.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,msep)

        Dim bErr As Long
        Dim mciSeekParms As MCI_SEEK_PARMS
        Dim pos As Long
        pos=SendMessage(GetDlgItem(hMainWnd,TrackBar1),TBM_GETPOS,0,0)\10
        mciSeekParms.dwTo=MCI_MAKE_TMSF(TrackNum, pos\60, pos mod 60,0)
        bErr=mciSendCommand(mop.wDeviceID,MCI_SEEK,MCI_TO,mciSeekParms)
        If bErr Then
            MessageBox(hMainWnd,"Missed to seek.","error",MB_OK)
            Exit Sub
        End If

        If sw Then
            SendMessage(hMainWnd,WM_COMMAND,CDPlayButton,0)
        End If
    End If
End Sub

Sub MainWnd_Timer(TimerID As Long)
    Dim hTrackBar As DWord
    Dim pos As Long

    If TimerID=ID_TIMER Then
        hTrackBar=GetDlgItem(hMainWnd,TrackBar1)

        pos=SendMessage(hTrackBar,TBM_GETPOS,0,0)
        pos=pos+1
        SendMessage(hTrackBar,TBM_SETPOS,1,pos)
    End If


	dim buffer[225] as Byte
	dim template[225] as Byte

	GetDateFormat(LOCALE_USER_DEFAULT,DATE_LONGDATE,ByVal 0,0,buffer,225)
	SendMessage(hStatusWnd,SB_SETTEXT,0,buffer)

	lstrcpy(template,"HH : mm : ss")
	GetTimeFormat(LOCALE_USER_DEFAULT,NULL,ByVal 0,template,buffer,225)
	SendMessage(hStatusWnd,SB_SETTEXT,1,buffer)
End Sub

Sub MainWnd_OpenButton_Click()
	dim ofn as OPENFILENAME
	dim buffer[MAX_PATH-1] as Byte
	dim hFile as long
	dim dwFileSize as DWord
	dim dwAccessByte as DWord

	ofn.lStructSize=76
	ofn.hwndOwner=hMainWnd
	ofn.lpstrFilter=Ex"Audio File (*.mp3*.wav;*.wma;*.mid)\0*.mp3;*.wav;*wma;*.mid.\0Video File (*.avi;*.wmv;*.mpg)\0*.avi;*.wmv;*.mpg\0All Files (*.*)\0*\0\0"
	ofn.nFilterIndex=1
	ofn.nMaxFile=MAX_PATH
	ofn.lpstrFile=buffer
	GetOpenFileName(ofn)

	SetWindowText(GetDlgItem(hMainWnd,PathBox),ofn.lpstrFile)


	With vop
		.dwCallback = hMainWnd
		.lpstrElementName=buffer
		.dwStyle = WS_CHILD or WS_VISIBLE
		.hWndParent = hVideoPlayer
	End With
	bErr = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT or _
	MCI_DGV_OPEN_PARENT or MCI_DGV_OPEN_WS, vop)
End Sub

Sub MainWnd_ResetButton_Click()
	dim hEdit as long
	dim buf as String

	hEdit=GetDlgItem(hMainWnd,PathBox)

	SetWindowText(hEdit,"")

	SetWindowText(hMainWnd,"MCI Player")
End Sub

Sub MainWnd_MCIPlayButton_Click()
	SetWindowText(hMainWnd,"You pushed play button of MCI")

    Dim bErr As Long
    Dim mpp As MCI_PLAY_PARMS
    Dim buffer[MAX_PATH-1] As Byte

    If mop.wDeviceID Then MainWnd_MCIStopButton_Click()

    mop.lpstrElementName=buffer
    GetWindowText(GetDlgItem(hMainWnd,PathBox),mop.lpstrElementName,260)

    mop.dwCallback=hMainWnd

    bErr=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop)
    If bErr Then
       	MessageBox(hMainWnd,"Missed to open of device.","error",MB_OK)
		SetWindowText(hMainWnd,"MCI Player")
		Exit Sub
    End If

    if mpp.dwCallback=hMainWnd then

    bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp)

	Else
'MCI Video============================================================
	msp.dwTo=0
	bErr = mciSendCommand(vop.wDeviceID,MCI_PLAY,0,vpp)
'=====================================================================
	End If

    If bErr Then
        MessageBox(hMainWnd,"Missed to play of device.","error",MB_OK)
		SetWindowText(hMainWnd,"MCI Player")
        Exit Sub
    End If

'MCI Video============================================================
	InvalidateRect(hMainWnd,ByVal 0,0)
'=====================================================================

	KillTimer(hMainWnd,ID_TIMER)

	SetWindowText(hMainWnd,"MCI Player")
End Sub

Sub MainWnd_MCIStopButton_Click()
	SetWindowText(hMainWnd,"You pushed stop button of MCI")

    Dim bErr As Long
    Dim dwCallback As DWord

    bErr=mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_WAIT,dwCallback)
    If bErr Then
        MessageBox(hMainWnd,"Missed to stop of device.","error",MB_OK)
		SetWindowText(hMainWnd,"MCI Player")
        Exit Sub
    End If

    mciSendCommand(mop.wDeviceID,MCI_CLOSE,MCI_WAIT,dwCallback)

    mop.wDeviceID=0

	bErr=mciSendCommand(vop.wDeviceID,MCI_STOP,0,d) 

	SetWindowText(hMainWnd,"MCI Player")
End Sub

Sub MainWnd_IDM_CDPLAY_MenuClick()
	MainWnd_CDPlayButton_Click()
End Sub

Sub MainWnd_IDM_CDPAUSE_MenuClick()
	MainWnd_CDPauseButton_Click()
End Sub

Sub MainWnd_IDM_CDSTOP_MenuClick()
	MainWnd_CDStopButton_Click()
End Sub

Sub MainWnd_IDM_MCIPLAY_MenuClick()
	MainWnd_MCIPlayButton_Click()
End Sub

Sub MainWnd_IDM_MCISTOP_MenuClick()
	MainWnd_MCIStopButton_Click()
End Sub

Sub MainWnd_IDM_ABOUT_MenuClick()
	ShellAbout(hMainWnd,"MCI Player  Ver4.00","Masaki Sanjo (M.S.)",LoadIcon(GetModuleHandle(0),101))
End Sub

Sub MainWnd_IDM_EJECT_MenuClick()
	MainWnd_EjectButton_Click()
End Sub

Sub MainWnd_IDM_OPEN_MenuClick()
	MainWnd_OpenButton_Click()
End Sub

Sub MainWnd_IDM_RESET_MenuClick()
	MainWnd_ResetButton_Click()
End Sub

Sub MainWnd_IDM_EXIT_MenuClick()
	SendMessage(hMainWnd,WM_CLOSE,0,0)
End Sub

Sub MainWnd_IDM_RELOAD_MenuClick()
	MainWnd_ReloadButton_Click()
End Sub

CreateMutex(0,0,"MCI Audio Player")
if GetLastError()=183 then
	MsgBox 0,"This program can not start up double.","error",MB_ICONEXCLAMATION
	End
End If
Sub MainWnd_IDM_READMEE_MenuClick()
	Exec "ReadMe_E.txt"
End Sub

Sub MainWnd_IDM_READMEJ_MenuClick()
	exec "ReadMe_J.txt"
End Sub

Sub MainWnd_KeyDown(KeyCode As Long, flags As Long)
	select case KeyCode		
		CASE VK_F1:
			MainWnd_ReloadButton_Click()
		CASE VK_F3:
			MainWnd_EjectButton_Click()
		CASE VK_F5:
			MainWnd_OpenButton_Click()
		CASE VK_F7:
			MainWnd_ResetButton_Click()
	End Select
End Sub

Sub MainWnd_CheckBox1_Click()
	if SendMessage(GetDlgItem(hMainWnd,CheckBox1),BM_GETCHECK,0,0) then
		SetWindowPos(hMainWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE)
	Else
		SetWindowPos(hMainWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE)
	End If
End Sub

Sub MainWnd_IDM_SW_MenuClick()
	exec "SystemWatcher.exe"
End Sub

Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
	SendMessage(hStatusWnd,WM_SIZE,cx,cy)
End Sub
長いですが、宜しくお願いします。


通報する
ページトップ
投稿記事Posted: 2005年10月29日(土) 21:46 
オフライン

登録日時: 2005年9月17日(土) 13:15
記事: 25
お住まい: 香川
前回、的外れな発言をして恥ずかしかったので今回は名誉挽回(名誉なんかないので汚名返上かな?)のため、いろいろ調べました。

ですが動画再生用のMCIのサンプルコードが無かったので勉強を兼ねてサンプルを作って見ました。

作る過程で分かったことを元に、コードを見たのですが再生時にMCI_NOTIFYが入っていない部分を直してもだめだったり、MCI_OPEN時にエラーが出ているのに再生できたりと不明な部分が多くて断念してしまいました。

実践コードモジュールの方にサンプルを入れましたので、参考にしてください。


通報する
ページトップ
 記事の件名: Re:
投稿記事Posted: 2005年11月08日(火) 18:19 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
コードの中に、「mciSendCommand」と「mciSendString」が混用されていたので、
「mciSendCommand」に統一してコードも変えてみたのですが、全く動作しません。
コードを載せておくので、いけないところを教えて下さい。
宜しくお願いします。


通報する
ページトップ
 記事の件名: Re:
投稿記事Posted: 2005年11月08日(火) 20:41 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
引用:
> コードの中に、「mciSendCommand」と「mciSendString」が混用されていたので、
> 「mciSendCommand」に統一してコードも変えてみたのですが、全く動作しません。
> コードを載せておくので、いけないところを教えて下さい。

コードを非表示にされるのはかまわないんですが
ソースを全部乗っけるのはいかがなものでしょう。

せっかくMciNotifyがうまく動かないという所まで絞っておいて
ちゃんとエラーを探してみましたか?

確かに作っている本人には気付きに難いこともあるでしょうが
あくまで他人は他人です。このような公共性の高い場で
バグ取りしてくれってことはないでしょう。
(個人的に依頼するなら別です、例えば私に手伝ってくれとか。。。)

せめて、怪しいところを絞り込んで公開しましょう。
その場合、ActiveBasicのバグの可能性も皆で評価できます。


さて、
本題ですが
M.S.様が考えている通りMciNotifyに問題があります。
最初のIf~ElseIfに注目してください。

何か可笑しくはないですか?

ElseIfは最初の条件が満たされないときに実行されるんでしたよね。


Sub MainWnd_MciNotify(flags As Long, DevID As Long)
If flags=MCI_NOTIFY_SUCCESSFUL Then
SendMessage(hMainWnd,WM_COMMAND,CDStopButton,0)
Elseif flags=MCI_NOTIFY_SUCCESSFUL then
dim dwCallback as DWord

if mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback) then
mop.wDeviceID=0
MessageBox(hMainWnd,"Finished to play the shound.","MCI Player",MB_OK)
Elseif mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback) then
vop.wDeviceID=0
MessageBox(hMainWnd,"Finished to play the video.","MCI Player",MB_OK)
End If
End If
End Sub


通報する
ページトップ
 記事の件名: Re:
投稿記事Posted: 2005年11月25日(金) 18:21 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
> コードを非表示にされるのはかまわないんですが
> ソースを全部乗っけるのはいかがなものでしょう。
>
> せっかくMciNotifyがうまく動かないという所まで絞っておいて
> ちゃんとエラーを探してみましたか?
>
> 確かに作っている本人には気付きに難いこともあるでしょうが
> あくまで他人は他人です。このような公共性の高い場で
> バグ取りしてくれってことはないでしょう。

そうですよね・・・。
モラル的に問題がありますよね。

>
引用:
さて、
本題ですが
M.S.様が考えている通りMciNotifyに問題があります。
最初のIf~ElseIfに注目してください。

何か可笑しくはないですか?

ElseIfは最初の条件が満たされないときに実行されるんでしたよね。


Sub MainWnd_MciNotify(flags As Long, DevID As Long)
If flags=MCI_NOTIFY_SUCCESSFUL Then
SendMessage(hMainWnd,WM_COMMAND,CDStopButton,0)
Elseif flags=MCI_NOTIFY_SUCCESSFUL then
dim dwCallback as DWord

if mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback) then
mop.wDeviceID=0
MessageBox(hMainWnd,"Finished to play the shound.","MCI Player",MB_OK)
Elseif mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback) then
vop.wDeviceID=0
MessageBox(hMainWnd,"Finished to play the video.","MCI Player",MB_OK)
End If
End If
End Sub
何回もやっていたのですが、「ElseIf」を「Else」にしても、
このコードを変えてもできません。

もう Give Up です。
教えて下さい。m(__)m


通報する
ページトップ
 記事の件名: Re:
投稿記事Posted: 2005年11月25日(金) 18:34 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
引用:
> Sub MainWnd_MciNotify(flags As Long, DevID As Long)
> If flags=MCI_NOTIFY_SUCCESSFUL Then
> SendMessage(hMainWnd,WM_COMMAND,CDStopButton,0)
> Elseif flags=MCI_NOTIFY_SUCCESSFUL then
> dim dwCallback as DWord
>
> if mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback) then
> mop.wDeviceID=0
> MessageBox(hMainWnd,"Finished to play the shound.","MCI Player",MB_OK)
> Elseif mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback) then
> vop.wDeviceID=0
> MessageBox(hMainWnd,"Finished to play the video.","MCI Player",MB_OK)
> End If
> End If
> End Sub

そもそも、MCI_NOTIFYメッセージが送信されてきた時に、コマンドが成功していればMCI_NOTIFY_SUCCESSFULが追加情報として送られてきます。

そこで、コードを見てみると、
コード:
     If flags=MCI_NOTIFY_SUCCESSFUL Then
         SendMessage(hMainWnd,WM_COMMAND,CDStopButton,0)
     Elseif flags=MCI_NOTIFY_SUCCESSFUL then
となっています。

これはif
flags=MCI_NOTIFY_SUCCESSFUL
の時にSendMessageでCDStopButtonを押して、

elseif
flags<>MCI_NOTIFY_SUCCESSFUL かつflags=MCI_NOTIFY_SUCCESSFUL
の時に以降のプログラムを実行させようとしていることに問題があります。

この場合、elseifの条件式は決して成立しません。


プログラムの流れを見る限り、
そもそもelseifは必要ないですよね。
コード:
> Sub MainWnd_MciNotify(flags As Long, DevID As Long)
    If flags=MCI_NOTIFY_SUCCESSFUL Then
        SendMessage(hMainWnd,WM_COMMAND,CDStopButton,0)
        dim dwCallback as DWord

        if mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback) then
            mop.wDeviceID=0
            MessageBox(hMainWnd,"Finished to play the shound.","MCI Player",MB_OK)
        Elseif mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback) then
            vop.wDeviceID=0
            MessageBox(hMainWnd,"Finished to play the video.","MCI Player",MB_OK)
        End If
    End If
End Sub

ここまで巨大なソースになるともう見ただけではどこにバグのあるのか分かりませんし、ボタンとかメニューとか作成するだけで大変です。
これで直らなければ、私にソースを送っていただければ対応します。。。



あと、プログラミング手法も考えましょう。
mci関連のAPIをクラスにまとめるだけでも全体はもっとすっきりすると思います。


通報する
ページトップ
 記事の件名: Re:
投稿記事Posted: 2005年11月25日(金) 23:38 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
NoWest 様、早急に答えていただきありがとうございます。

やってみたのですが、残念ながら直りませんでした。

そこで、NoWest 様にソースを送ってみようと思うのですが、
これは、プロジェクトになっている全てのファイルを添付すればよいのでしょうか?


通報する
ページトップ
 記事の件名: Re:
投稿記事Posted: 2005年11月26日(土) 19:04 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
引用:
> NoWest 様、早急に答えていただきありがとうございます。
>
> やってみたのですが、残念ながら直りませんでした。
>
> そこで、NoWest 様にソースを送ってみようと思うのですが、
> これは、プロジェクトになっている全てのファイルを添付すればよいのでしょうか?
とりあえず、個人的なことになるのでメールか私のHPの掲示板でご質問いただければと思いますが、兎に角、動作をチェックするのに最低限のファイル(コンパイルエラーにならない程度)を送ってください。
面倒ならプロジェクトファイルごと圧縮するなりして送っていただければ
バグの解析後、結果をメールで返答したいと思います。

(ここ最近は”いろいろ”と忙しいので返答が遅れるかもしれませんが...)



P.S.
私自身もMCIを使ってマルチメディアプレイヤーを作ったことがあるので
開発の大変さはよく分かります。

なんといっても日本語の解説サイトが少ないですし、日本語の資料もほぼ皆無に等しいですかね。

上ではきびしいことを書いてますが、
個人的には、ぜひ頑張って完成して頂きたいと思っています。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 8 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[19人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean