📄 1.asm
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Mp3 播放测试程序 Ver 1.0 - 2007/06/04
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc ;InitCommonControls的头文件
include comdlg32.inc ;GetOpenFileName的头文件
include winmm.inc ;MCI头文件
includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
includelib comdlg32.lib
includelib winmm.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDD_DIALOG1 equ 101
IDC_PLAY equ 1000
IDC_STOP equ 1001
IDC_RP equ 1002
IDC_PER equ 1003
IDC_NEXT equ 1004
IDC_EDIT1 equ 1005
IDC_DEL equ 1006
IDC_OPEN equ 1007
IDC_BMIM equ 1008
IDC_EXIT equ 1009
IDC_SLIDER1 equ 1010
IDC_STATIC equ -1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
dwFlag dd ?
hWinMain dd ?
hInstance dd ?
hDevice dd ?
m_flag dd ?
m_flag1 dd ?
m_flag2 dd ?
m_flag3 dd ?
szBuffer db 256 dup (?)
file db 256 dup (256 dup(?))
stOpenFileName OPENFILENAME <?> ;定义了一个公共对话框---OPENFILENAME结构体类型变量
.data
Caption db "Error...",0
Error db "Error to play MP3 file!",0
Play db "&播放",0
Stop db "&停止",0
Tstop dd "&暂停",0
Rp db "&录音",0
Pre db "&上一首",0
Next db "&下一首",0
Open db "&打开",0
Del db "&删除",0
Bmim db "&托盘",0
Exit db "&退出",0
szDevice db "MPEGVideo",0
szTitleSave db "Open MP3 file...",0
szExt db '*.mp3',0
szFilter db 'MP3 Files(*.mp3)',0,'*.mp3',0,'支持所有格式(*.*)',0,'*.*',0,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 子程序声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;********************************************************************
; 得到要播放的mp3文件名
;********************************************************************
xor ecx ecx 用于保存目录个数
_GetFile proc
; 对结构体的成员进行初始化
mov stOpenFileName.Flags,OFN_P
ATHMUSTEXIST or OFN_FILEMUSTEXIST ;设置标志位
mov stOpenFileName.lStructSize,SIZEOF stOpenFileName ;指定这个结构体的大小
mov eax,hWinMain
mov stOpenFileName.hWndOwner,eax ;指向所有者对话框窗口的句柄
mov stOpenFileName.lpstrFilter,offset szFilter ;扩展名
mov stOpenFileName.lpstrFile,offset szBuffer ;文件名缓冲
mov stOpenFileName.nMaxFile,255 ;文件名缓冲长度
mov stOpenFileName.lpstrInitialDir,0 ;指向以空字符结束的字符串,可以在这个字符串中指定初始目录
mov stOpenFileName.lpstrTitle,offset szTitleSave ;指向在对话框的标题栏中放置的字符串
mov stOpenFileName.lpstrDefExt,offset szExt ;指向包含默认扩展名的缓冲
mov eax stOpenFileName.lpstrDefExt
mov file eax
inc ecx
invoke GetOpenFileName,addr stOpenFileName ;建立文件名对话框
.if eax == FALSE
ret
.endif
invoke SetDlgItemText,hWinMain,ID_FILE,addr szBuffer ;设置对话框的编辑栏
call _StopPlayMP3 ;保证重新选择一个文件时,关闭原来已经在播放的mp3文件
ret
_GetFile endp
;********************************************************************
; 播放mp3文件
;********************************************************************
_PlayMP3 proc
local @stMCIOpen:MCI_OPEN_PARMS ;打开设备的结构体
local @stMCIPlay:MCI_PLAY_PARMS ;播放结构体
.if aa==0
call _GetFile
.else
; 初始化MCI_OPEN_PARMS结构体
mov @stMCIOpen.lpstrDeviceType,offset szDevice ;mp3类设备
mov @stMCIOpen.lpstrElementName,offset szBuffer ;要打开的文件名
invoke mciSendCommand,0,MCI_OPEN,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,addr @stMCIOpen ;调用这个API函数打开设备
mov eax,@stMCIOpen.wDeviceID ;接受消息的设备ID
mov hDevice,eax
mov eax,hWinMain
mov @stMCIPlay.dwCallback,eax ;它指向一个特定的CALLBACK函数,事件柄,窗口柄,或一个将在波形音频回放时以便处理与回放进度相关的消息的期间呼叫的线程ID,如果无须CALLBACK函数,可以将其设为0
invoke mciSendCommand,hDevice,MCI_PLAY,MCI_NOTIFY,addr @stMCIPlay ;调用这个API函数播放文件
.endif
.if eax == 0
invoke SetDlgItemText,hWinMain,ID_PLAY,addr Tstop ;设置对话框play按钮上的字为stop
mov dwFlag,1
.else
invoke MessageBox,hWinMain,addr szError,addr szCaption,MB_OK ;如果播放文件失败,就会调用这个消息框
.endif
ret
_PlayMP3 endp
;********************************************************************
; 停止播放
;********************************************************************
_StopPlayMP3 proc
local @stMCIStop:MCI_GENERIC_PARMS ;用来关闭设备的结构体
mov eax,hWinMain
mov @stMCIStop.dwCallback,eax
invoke mciSendCommand,hDevice,MCI_STOP,MCI_NOTIFY,addr @stMCIStop ;先停止播放
invoke mciSendCommand,hDevice,MCI_CLOSE,MCI_NOTIFY,addr @stMCIStop ;再关闭设备
invoke SetDlgItemText,hWinMain,IDOK,addr szPlay ;设置对话框stop按钮上的字为play
mov dwFlag,0
ret
_StopPlayMP3 endp
;********************************************************************
; 模式对话框的过程函数
;********************************************************************
_ProcDlgMain proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL ;关闭对话框
.elseif eax == WM_INITDIALOG ;初始化对话框
mov eax,hWnd
mov hWinMain,eax
invoke SendDlgItemMessage,hWinMain,ID_FILE,EM_SETREADONLY,TRUE,NULL ;向编辑框发送消息
.elseif eax == WM_COMMAND
mov eax,wParam
.if eax == ID_BROWSE
call _GetFileName
.elseif eax == IDOK
.if dwFlag == 0
call _PlayMP3
.else
call _StopPlayMP3
.endif
.endif
.else
;********************************************************************
; 注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息
; 要返回 FALSE
;********************************************************************
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;********************************************************************
; 主过程
;********************************************************************
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,addr _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -