问题解决,马上结帖,谢谢!
解决方案 »
- vb 关于图片的问题
- VB怎么判断一个excel是否打开啊,高手们,在线等
- 结束程序的所有进程
- 程序退出时有时出现 "0x "指令引用"0x00000000"内存。该内存不能为"read"
- 如何在程序运行时修改组合框的Style属性?
- 怎么知道屏幕的大小??
- 请问, 在vb6中使用了Microsoft SOAP Toolkit 3.0的程序的打包问题?
- 求crystal report enterprise8.5的keycode,谢谢
- !!!先进,现取分!!
- 做了一个MIDI的应用,有录音,还原曲谱,修改,播放等功能,但录音时需要手工设定MIDI音源。请问如何编程选择录音源为MIDI?
- CSDN里没有高手么?为什么没有人回答我?如何在WIN2000下向一个dos程序发送命令(向左,向右键等)。
- 提个建议,大家提问题的时候最好把主要内容列为标题
Private Declare Function mciSendString Lib "winmm.dll" _
Alias "mciSendStringA" _
(ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) _
As Long
如要播放,先Open,再Play.
以下是我的代码中的一部分,节选如下:
dim cmdToDo as string 'mciSendString能够发送的命令
1.Open:
Const WS_CHILD = &H40000000
cmdToDo = "open " & FileName & " type " & typeDevice & " Alias " & AliasName & " parent " & hWnd & " Style " & WS_CHILD
2.Pause:
cmdToDo="Pause " & AliasName
3.Play:
dim fromFrame as string '指定要播放的第一帧
dim toFrame as string '指定要播放的最后一帧
cmdToDo = "play " & AliasName & " from " & fromFrame & " to " & toFrame
4.FullScreen:
cmdToDo = "play " & AliasName & " FullScreen"
5.Resume:
cmdToDo="Resume " & AliasName
6.Close
cmdToDo="Close " & AliasName
cmdToDo="Close All"
7.SetVolume
' [Channel]
' 指定想要控制的声道,其取值为如下之一:
' Left 控制左声道
' Right 控制右声道
' All 控制左声道和右声道
' [VolumeValue]
' 指定所要控制声道的音量大小,其取值范围为从0到100.
cmdToDo = "setaudio " & AliasName & " " & Channel & " Volume to " & VolumeValue
8.stop:
cmdToDo = "stop " & AliasName
9.setChannels:
' [Channel]
' 指定想要控制的声道,其取值为如下之一:
' Left 控制左声道
' Right 控制右声道
' All 控制左声道和右声道
' [OnOrOFF]
' 指定所要控制声道的控制动作,其取值为如下之一:
' On 打开声道
' Off 关闭声道
cmdToDo = "set " & AliasName & " audio " & Channel & " " & ONOrOFF
10.Put:
[Left]不言而喻
[Top]不言而喻
[Width]不言而喻
[Height]不言而喻
cmdToDo="put " & AliasName & " window at " & Left & " " & Top & " " & Width & " " & Height
11.GetStatus
cmdToDo="status " & AliasName & " mode"
例子:
Dim Status As String
mciSendString "status " & AliasName & " mode", Status, 128, 0&
如成功执行,则status返回如下值之一:
stopped,playing,Paused
12.GetTotalFrames:
直接给个例子:
'这个模块用于计算要播放的多媒体文件总共包含的帧数
Public Function GetTotalFrames(AliasName As String) As Long
Dim sReturn As Long
Dim Total As String
sReturn = mciSendString("set " & AliasName & " time format frames", Total, 128, 0&)
sReturn = mciSendString("status " & AliasName & " length", Total, 128, 0&)
If Not sReturn = 0 Then
GetTotalFrames = -1
Exit Function
End If
GetTotalFrames = Val(Total)
End Function
Alias "mciSendStringA" _
(ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) _
As Long
'例如打开:
Public Function OpenMultimedia(hWnd As Long, AliasName As String, FileName As String, typeDevice As String) As String
' [typeDevice]
' 指定一个MCI设备的类型,取值应为如下:
' ┌──────┬─────────────┬────────┐
' │ Type MCI │ description │ driver file │
' ├──────┼─────────────┼────────┤
' │ sequencer │处理mid文件 │ mciseq.drv │
' │ │ │ │
' │ MPEGVideo │处理大多数多媒体文件,如: │ mciqtz.drv │
' │ │mpg,mp3,mp2,..,au,aiff.. │ │
' │ │等等,同时也支持avi,vob(用 │ │
' │ │于DVD),midi,mid,和rmi文件.│ │
' │ │可以使用"MPEGVideo"播放很 │ │
' │ │多文件,甚至包括avivideo. │ │
' │ │ │ │
' │ avivideo │处理AVI Movie │ mciavi.drv │
' └──────┴─────────────┴────────┘
Const WS_CHILD = &H40000000
Dim cmdToDo As String * 255
Dim dwReturn As Long
Dim ret As String * 128
Dim tmp As String * 255
Dim lenShort As Long
Dim ShortPathAndFile As String cmdToDo = "open " & FileName & _
" type " & typeDevice & _
" Alias " & AliasName & _
" parent " & hWnd & _
" Style " & WS_CHILD
dwReturn = mciSendString(cmdToDo, 0&, 0&, 0&) If Not dwReturn = 0 Then 'not Success
mciGetErrorString dwReturn, ret, 128 'Get the error
OpenMultimedia = ret
Exit Function
End If OpenMultimedia = "Success"
End Function'例如播放:
Public Function PlayMultimedia(AliasName As String, from_where As String, to_where As String) As String
Dim cmdToDo As String * 128
Dim dwReturn As Long
Dim ret As String * 128
If from_where = vbNullString Then from_where = 0
If to_where = vbNullString Then to_where = GetTotalFrames(AliasName)
cmdToDo = "play " & AliasName
dwReturn = mciSendString(cmdToDo, 0&, 0&, 0&) '播放
If Not dwReturn = 0 Then 'not Success
mciGetErrorString dwReturn, ret, 128 'get the error
PlayMultimedia = ret
Exit Function
End If
PlayMultimedia = "Success"
End Function
-在 某 些 情 况 下, 例 如 程 序 员 正 在 编 写 一 个 游 戏, 或 是 将 要 进 行 一 项 非 常 冗 长 无 聊 的过 程, 可 以 通 过 播 放 音 乐 来 增 加 游 戏 的 声 光 效 果 或 是 减 少 漫 长 的 等 待 所 带 来 的 困 倦。本 文介 绍 如 何 在Microsoft Visual Basic 中 对 声 音 文 件 进 行 播 放。 播 放 声 音文 件 ---- 在Microsoft Visual Basic 中 进 行 多 媒 体 音 乐 的 播 放 是 一 件非 常 轻 松 的 事 情。 在Microsoft Windows 系 统 中 支 持 的 声 音 文 件 有WAV 文 件 和MIDI 文 件,通 常 使 用Windows 应 用 程 序 编 程 接 口(API) 函 数mciExecute 函 数 可 以 对MIDI 文 件 进 行 播放。 而 使 用API 函 数sndPlaySound 则 可 以 对WAV 播 放 文 件 进 行 播 放, 当 然, 你 也 可 以 使用mciExecute 函 数 来 播 放WAV 文 件。 ---- 为 了 播 放WAV 文 件, 你 需 要 在 你的 程 序 窗 体 的 通 用 声 明 部 分 中, 或 是 标 准 模 块 中 添 加 如 下 的 声 明 语句: ---- Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As
Long ---- 以 及 如 下 的 标 识 常量: ---- Public Const SND_SYNC = &H0
---- Public Const SND_ASYNC = &H1
---- Public Const SND_NODEFAULT = &H2
---- Public Const SND_MEMORY = &H4
---- Public Const SND_ALIAS = &H10000
---- Public Const SND_FILENAME = &H20000
---- Public Const SND_RESOURCE = &H40004
---- Public Const SND_ALIAS_ID = &H110000
---- Public Const SND_ALIAS_START = 0
---- Public Const SND_LOOP = &H8
---- Public Const SND_NOSTOP = &H10
---- Public Const SND_VALID = &H1F
---- Public Const SND_NOWAIT = &H2000
---- Public Const SND_VALIDFLAGS = &H17201F
---- Public Const SND_RESERVED = &HFF000000
---- Public Const SND_TYPE_MASK = &H170007 ---- sndPlaySound 函 数 需 要 两 个 参 数, 第 一 个 参数soundfilename 是 要 播 放 的WAV 文 件 的 名 称。 第 二 个 参 数 是 一 个 表 明 播 放 方 式 的 标 识 常量, 其 定 义 的 值 如 上 所 示, 通 常 所 使 用 的 标 识 意 义 如 下: ---- SND_SYNC 播 放WAV 文 件, 播 放 完 毕 后 将 控 制 转 移 回 你 的 应 用 程 序 中。
---- SND_ASYNC 播放WAV 文 件, 然 后 将 控 制 立 即 转 移 回 你 的 应 用 程 序 中, 而 不 管 对WAV 文 件 的 播 放 是 否 结束。
---- SND_NODEFAULT 不 要 播 放 缺 省 的WAV 文 件, 以 免 发 生 某 些 意 外 的 错误。
---- SND_MEMORY 播 放 以 前 已 经 加 载 到 内 存 中 的WAV 文件。
---- SND_LOOP 循 环 播 放WAV 文 件。
---- SND_NOSTOP 在 开 始 播放 其 它 的WAV 文 件 之 前, 需 要 完 成 对 本WAV 文 件 的 播 放。 ---- 注意:SND_LOOP 标 识 通 常 需 要 同SND_ASYNC 共 同 使 用, 也 即 在 两 个 标 识 之 间 添 加 与 播 放 符,以 免 在 对WAV 文 件 进 行 播 放 的 时 候 将 系 统 挂 起。 ---- 为 了 播 放MIDI 文 件,你 需 要 在 你 的 程 序 窗 体 的 通 用 声 明 部 分 中, 或 是 标 准 模 块 中 添 加 如 下 的 声 明 语句: ---- Private Declare Function mciExecute Lib "winmm.dll" Alias "mciExecute" (ByVal lpstrCommand As String) As Long ---- mciExecute 函 数 只 需 要 一 个 参 数,CommandString, 顾 名 思义,它 是 一 个 命 令 字 符 串, 用 于 表 明 对 声 音 文 件 播 放 的 命 令,例 如, 希 望 完 整 播 放 声 音 文 件,则 该 字 符 串 就 是 字 符 串損lay" 加 上 声 音 文 件 的 路 径 以 及 文 件 名 称, 如 下 所示** ---- Dim ReturnValue As Long
---- ReturnSoundValue = mciExecute("play C:\WIN95\MEDIA\CANYON.MID") ---- 如 果 希 望 对 声 音 文 件 的 部 分 进 行播 放, 可 以 使 用from...to... 语 句 格 式, 例 如 若 要 播 放CANYON.MID 文 件 的10 毫 秒 到100 毫秒 的 部 分, 可 以 使 用 如 下 的 语 句: ---- Dim ReturnValue As Long
---- ReturnSoundValue = mciExecute("play C:\WIN95\MEDIA\CANYON.MID from 10 to 100")
---- mciExecute 函 数 也可 以 用 来 对WAV 文 件 进 行 播 放, 方 法 同 播 放MIDI 一 样。 样 例 程序 ---- 1. 在Visual Basic 中 开 始 一 个 新 的 项 目, 采 用 缺 省 的 方 法 建立Form1。
---- 2. 将 如 下 的 声 明 语 句 添 加 到Form1 的 通 常 声 明 部 分 中( 注 意 每个 声 明 语 句 需 要 被 书 写 在 一 行 内): ---- Private Declare Function sndPlaySound Lib "winmm.dll" Alias "
sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As
Long ---- Const SND_SYNC = &H0
---- Const SND_ASYNC = &H1
---- Const SND_NODEFAULT = &H2
---- Const SND_MEMORY = &H4
---- Const SND_ALIAS = &H10000
---- Const SND_FILENAME = &H20000
---- Const SND_RESOURCE = &H40004
---- Const SND_ALIAS_ID = &H110000
---- Const SND_ALIAS_START = 0
---- Const SND_LOOP = &H8
---- Const SND_NOSTOP = &H10
---- Const SND_VALID = &H1F
---- Const SND_NOWAIT = &H2000
---- Const SND_VALIDFLAGS = &H17201F
---- Const SND_RESERVED = &HFF000000
---- Const SND_TYPE_MASK = &H170007 ---- Private Declare Function mciExecute Lib "winmm.dll" Alias "mciExecute" (ByVal lpstrCommand As String) As Long ---- 3. 在Form1 上 添 加 一 个 文 本 框 控 件, 采 用 缺 省 的 方 法 建立Text1。 将 它 的Caption 属 性 设 置 为NULL。 ---- 4. 在Form1 上 添 加 一 个命 令 按 钮 控 件, 采 用 缺 省 的 方 法 建 立Command1。 将 它 的Caption 属 性 设 置 为" 使用sndPlaySound 函 数敗* ---- 5. 在Form1 上 添 加 一 个 命 令 按 钮 控 件, 采 用缺 省 的 方 法 建 立Command2。 将 它 的Caption 属 性 设 置 为" 使 用mciExecute 函数敗* ---- 6. 将 如 下 的 代 码 添 加 到Command1 的 单 击 事 件中:
Private Sub Command1_Click()
Dim ReturnValue As Long
Text1.Text = " 使 用sndPlaySound 函 数 播 放TADA.WAV 文件。"
ReturnValue = sndPlaySound("C:\WIN95\MEDIA\TADA.WAV", SND_SYNC)
End Sub
---- 7. 将 如 下 的 代 码 添 加 到Command2 的 单 击 事件 中:
Private Sub Command2_Click()
Dim ReturnValue As Long
Text1.Text = " 使 用mciExecute 函 数 播 放Canyon.mid 文件。"
ReturnSoundValue = mciExecute
("play C:\WIN95\MEDIA\CANYON.MID from 10 to 100")
End Sub
---- 通 过 按 下F5 键 来 执 行 样 例 程 序。 单击" 使 用sndPlaySound 函数" 命 令 按 钮 则 使 用sndPlaySound 函 数 来 播 放C:\WIN95\MEDIA 目录下 面 的TADA.WAV 声 音 文 件。 单 击" 使 用mciExecute 函 数" 则 使 用mciExecute 函 数 来 播放C:\WIN95\MEDIA 目 录 下 面 的CANYON.MID 文 件 的10 毫 秒 到100 毫 秒 的 部分。