21,499
社区成员
发帖
与我相关
我的任务
分享
.386
.MODEL flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include winmm.inc
includelib user32.lib
includelib kernel32.lib
includelib winmm.lib
.data
str1 db "open D:\Media\Music\美丽心情.mp3 alias mp3",0
str2 db "play mp3 wait",0
.code
start:
invoke mciSendString,offset str1, 0, 0, 0
invoke mciSendString,offset str2, 0, 0, 0
invoke ExitProcess,NULL
end start
TITLE Demo.asm
; ===============================================
; Author: 狼の禅
; Date: 09/10/2010
; ===============================================
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include masm32.inc
include shell32.inc
include winmm.inc
include comdlg32.inc
includelib user32.lib
includelib comctl32.lib
includelib masm32.lib
includelib winmm.lib
includelib comdlg32.lib
; -----------------------------------------------
MENU_ABOUTAUTHOR equ 1000
MENU_SELECT equ 1001
MENU_START equ 1002
MENU_PAUSE equ 1003
; -----------------------------------------------
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
PlayMidiFile PROTO :DWORD, :DWORD
; ===============================================
.data
hInstance dd 0 ;应用程序句柄
hWnd dd 0 ;窗口句柄
hMenu dd 0 ;菜单句柄
ClassName db "Demo",0
WindowName db "Demo(狼の禅)",0
MenuAbout db "帮助(&H)", 0
MenuAboutAuthor db "关于作者(&A)", 0
FileFilter db "Mid Files (*.mid)",0,"*.mid",0 ;文件名过滤
FilePath db 128 dup(0) ;打开音乐文件名
szMIDISeqr db "Sequencer",0
MidDeviceID dd 0
MenuSelect db "选择音乐",0
MenuStart db "播放音乐",0
MenuPause db "暂停音乐",0
Author db "Author:狼の禅",0dh,"Date: 16/01/2010",0
; ===============================================
.code
start:
invoke GetModuleHandle,0 ;获取应用程序模块句柄
mov hInstance,eax ;保存应用程序句柄
invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT
invoke ExitProcess,eax ;退出程序,并返回eax的值
; ===============================================
WinMain proc hInst:DWORD, hPrevInst:DWORD,CmdLine:DWORD, CmdShow:DWORD
LOCAL wndclass:WNDCLASSEX
LOCAL Msg:MSG
mov wndclass.cbSize,sizeof WNDCLASSEX
mov wndclass.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wndclass.lpfnWndProc,OFFSET WndProc
mov wndclass.cbClsExtra,0
mov wndclass.cbWndExtra,0
mov eax,hInst
mov wndclass.hInstance,eax
mov wndclass.hbrBackground,COLOR_WINDOW+1
mov wndclass.lpszMenuName,0
mov wndclass.lpszClassName,OFFSET ClassName
invoke LoadIcon,hInst,NULL
mov wndclass.hIcon,eax
invoke LoadCursor,0,IDC_ARROW
mov wndclass.hCursor,eax
mov wndclass.hIconSm,0
invoke RegisterClassEx,ADDR wndclass ;注册用户定义的窗口类
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR ClassName,
ADDR WindowName,
WS_OVERLAPPEDWINDOW,
200,50,500,300,
0,0,
hInst,0 ;创建窗口
mov hWnd,eax ;保存窗口句柄
invoke ShowWindow,hWnd,SW_SHOWNORMAL ;
invoke UpdateWindow,hWnd
MessageLoop:
invoke GetMessage,ADDR Msg,0,0,0 ;获取消息
cmp eax,0
je ExitProgram
invoke TranslateMessage,ADDR Msg ;转换键盘消息
invoke DispatchMessage,ADDR Msg ;分发消息
jmp MessageLoop
ExitProgram:
mov eax,Msg.wParam
ret
WinMain endp
; ===============================================
WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
local hPopMenu ;一级菜单句柄
LOCAL File :OPENFILENAME
.if uMsg == WM_CREATE
invoke CreateMenu
mov hMenu, eax
.if eax
invoke CreatePopupMenu ;创建一级菜单
mov hPopMenu, eax ;保存一级菜单句柄
invoke AppendMenu, hPopMenu, NULL, MENU_ABOUTAUTHOR, addr MenuAboutAuthor ;添加二级菜单
invoke AppendMenu, hPopMenu, NULL, MENU_SELECT, addr MenuSelect ;添加二级菜单
invoke AppendMenu, hPopMenu, NULL, MENU_START, addr MenuStart ;添加二级菜单
invoke AppendMenu, hPopMenu, NULL, MENU_PAUSE, addr MenuPause ;添加二级菜单
invoke AppendMenu, hMenu, MF_POPUP, hPopMenu, addr MenuAbout ;添加一级菜单
.endif
invoke SetMenu, hWin, hMenu ;设置菜单
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,0 ;退出消息循环
.elseif uMsg == WM_COMMAND
.if wParam == MENU_ABOUTAUTHOR
invoke MessageBoxA,hWin,ADDR Author,ADDR ClassName,MB_OK
.elseif wParam == MENU_SELECT ;选择音乐
mov File.lStructSize,sizeof OPENFILENAME
mov eax,hWin
mov File.hwndOwner,eax
mov File.hInstance,0
mov File.lpstrFilter,OFFSET FileFilter
mov File.lpstrCustomFilter,0
mov File.nMaxCustFilter ,0
mov File.nFilterIndex,0
mov File.lpstrFile,OFFSET FilePath
mov File.nMaxFile,MAX_PATH
mov File.lpstrFileTitle,0
mov File.nMaxFileTitle,0
mov File.lpstrInitialDir,0
mov File.lpstrTitle,0
mov File.Flags,0
mov File.nFileOffset,0
mov File.nFileExtension,0
mov File.lpstrDefExt,OFFSET FileFilter
mov File.lCustData,0
mov File.lpfnHook,0
mov File.lpTemplateName,0
invoke GetOpenFileName,addr File
invoke PlayMidiFile,hWin,addr FilePath
.elseif wParam == MENU_START ;播放音乐
invoke PlayMidiFile,hWin,addr FilePath
.elseif wParam == MENU_PAUSE ;暂停音乐
invoke mciSendCommand,MidDeviceID,MCI_CLOSE,0,0
.endif
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam ;调用默认消息处理函数
ret
.endif
xor eax,eax
ret
WndProc endp
; ===============================================
;====================== Start PlayMidiFile Start =====================
PlayMidiFile proc hWin:DWORD,NameOfFile:DWORD
LOCAL mciOpenParms:MCI_OPEN_PARMS,mciPlayParms:MCI_PLAY_PARMS
mov eax,hWin
mov mciPlayParms.dwCallback,eax
mov eax,OFFSET szMIDISeqr
mov mciOpenParms.lpstrDeviceType,eax
mov eax,NameOfFile
mov mciOpenParms.lpstrElementName,eax
invoke mciSendCommand,0,MCI_OPEN,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,ADDR mciOpenParms
mov eax,mciOpenParms.wDeviceID
mov MidDeviceID,eax
invoke mciSendCommand,MidDeviceID,MCI_PLAY,MCI_NOTIFY,ADDR mciPlayParms
ret
PlayMidiFile endp
;======================== End PlayMidiFile End =======================
end start