ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 914|回复: 6

[求助] 包对象的音乐文件VBA怎么播放(小fisher文件)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-4-24 13:43 | 显示全部楼层 |阅读模式
我从小fisher的游戏文件里下载了包(对象),里面有音乐WAV文件,我想用程序打开这些音乐文件播放,不知道怎么操作,请各位大侠帮忙,谢谢。文件图标

附件:
wav文件.png

包对象.zip

22 Bytes, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2020-4-25 08:51 | 显示全部楼层
要调用windows自带播放器

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-25 12:35 | 显示全部楼层
约定的童话 发表于 2020-4-25 08:51
要调用windows自带播放器

不好意思,上午值班,让你久等了。
老师能不能讲具体点,我的文件里已经有了程序,但是好像运行没有效果。小fisher的这个文章http://club.excelhome.net/thread-420067-1-1.html里有文件,在窗体调用时能播放包里的文件,但是单独怎么调用,或者在工作表里调用没说,麻烦你了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-28 16:48 | 显示全部楼层
哪位老师帮帮我?谢谢了。

TA的精华主题

TA的得分主题

发表于 2020-4-28 18:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不清楚你的问题的具体是什么.......这些文件就是wav格式的, 你可以在temp文件夹下找到这写文件,然后随便一个音频播放器都可以播放.....
如果你需要在vba里播放, @小fisher都已经写好了怎么播放这些文件, 在"sound"模块中
播放方式为调用api来实现
sndPlaySound Lib "winmm.dll"
Image 1.jpg


TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-30 14:25 | 显示全部楼层
laiwatch 发表于 2020-4-28 18:39
不清楚你的问题的具体是什么.......这些文件就是wav格式的, 你可以在temp文件夹下找到这写文件,然后随便一 ...

直接播放还是有难度的,我理解播放的过程了。
1、导出包文件。
2、播放这个文件里的音乐文件。
我觉得这个思路是对的。见http://club.excelhome.net/forum. ... 708&pid=2721115
后来我把它改编成PowerPoint了。
模块代码:
  1. Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As Any, ByVal uFlags As Long) As Long
  2. Public Const SND_NODEFAULT& = &H2
  3. Public Const SND_RESOURCE& = &H40004
  4. Public Const SND_ASYNC = &H1         '  play asynchronously
  5. Public Const SND_MEMORY = &H4         '  lpszSoundName points to a memory file
  6. Public Const SND_SYNC = &H0         '  play synchronously (default)

  7. Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
  8. Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
  9. Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
  10. Private Declare Function CloseClipboard Lib "user32" () As Long
  11. Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
  12. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  13. Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
  14. Private Declare Function EmptyClipboard Lib "user32" () As Long

  15. Public Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
  16. Public Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long


  17. Public Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
  18. Public 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
  19. Public Declare Function mciGetDeviceID Lib "winmm.dll" Alias "mciGetDeviceIDA" (ByVal lpstrName As String) As Long
  20. Public Declare Function mciGetCreatorTask Lib "winmm.dll" (ByVal wDeviceID As Long) As Long

  21. Public Const MAX_PATH = 255
  22. Public tmpFile As String
  23. Dim lRet As Long
  24. Dim ret As String * 1024
  25. Public bPlaying As Boolean

  26. Public Enum AudioFormatConstants
  27.     wav = 0
  28.     other = 1
  29. End Enum

  30. Public Function GetTempFile() As String
  31.     Dim sTmpPath As String
  32.     Dim sTmpFile As String
  33.     sTmpPath = Space(MAX_PATH)
  34.     GetTempPath MAX_PATH, sTmpPath
  35.     sTmpPath = Left(sTmpPath, InStr(sTmpPath, Chr(0)) - 1)
  36.     sTmpFile = Space(MAX_PATH)
  37.     GetTempFileName sTmpPath, "bgm" & Chr(0), 0, sTmpFile
  38.     GetTempFile = Left(sTmpFile, InStrRev(sTmpFile, ".") - 1) & ".mp3"
  39. End Function


  40. Sub playSound()
  41.     lRet = mciSendString("play  " & tmpFile & "  repeat", ret, 1024, 0)
  42.     Id = mciGetDeviceID(tmpFile)
  43.     bPlaying = True
  44. End Sub

  45. Sub stopSound()
  46.     On Error Resume Next
  47.     mciSendString "close all", ret, 1024, 0
  48.     bPlaying = False
  49. End Sub

  50. Sub test()
  51.     tmpFile = GetTempFile
  52.     On Error Resume Next
  53.     itop = ActivePresentation.Slides(1).Shapes("Object 5").Top
  54.     On Error GoTo 0
  55.     If IsEmpty(itop) Then Exit Sub
  56.     Export tmpFile, ActivePresentation.Slides(1).Shapes("Object 5"), other
  57.     playSound
  58. End Sub

  59. Sub test2()
  60.     On Error Resume Next
  61.     stopSound
  62.     Kill tmpFile
  63. End Sub

  64. Public Sub Export(targetFile As String, objOLE As Shape, AudioFormat As AudioFormatConstants)
  65.     Dim hMem As Long
  66.     Dim nClipsize As Long
  67.     Dim lpData As Long
  68.     Dim bytData() As Byte
  69.     objOLE.Copy
  70.     OpenClipboard 0&
  71.     hMem = GetClipboardData(49156)
  72.     If CBool(hMem) Then
  73.         nClipsize = GlobalSize(hMem)
  74.         lpData = GlobalLock(hMem)
  75.         If lpData <> 0 Then
  76.             ReDim bytData(0 To nClipsize) As Byte
  77.             CopyMemory bytData(0), ByVal lpData, nClipsize
  78.         End If
  79.         GlobalUnlock hMem
  80.     End If
  81.     EmptyClipboard
  82.     CloseClipboard
  83.    
  84.     If AudioFormat <> wav Then
  85.         Dim iPos As Long
  86.         Dim iCountZero As Integer
  87.         Dim lOffset As Long
  88.         Dim lFilesize As Long
  89.         For iPos = 0 To nClipsize
  90.             If bytData(iPos) = 0 Then
  91.                 iCountZero = iCountZero + 1
  92.                 If iCountZero = 3 Then Exit For
  93.             End If
  94.         Next
  95.         iPos = iPos + 5
  96.         CopyMemory lOffset, bytData(iPos), 4
  97.         iPos = iPos + lOffset + 4
  98.         CopyMemory lFilesize, bytData(iPos), 4
  99.         iPos = iPos + 4
  100.         CopyMemory bytData(0), bytData(iPos), lFilesize
  101.         ReDim Preserve bytData(0 To lFilesize) As Byte
  102.     End If

  103.     Dim fileNumber As Integer
  104.     fileNumber = FreeFile
  105.     Open targetFile For Binary As #fileNumber
  106.         Put #fileNumber, , bytData
  107.     Close #fileNumber
  108.    
  109. End Sub
复制代码

slide1代码(播放、停止两个按钮)
  1. Private Sub CommandButton1_Click()
  2.     test
  3. End Sub

  4. Private Sub CommandButton2_Click()
  5.     stopSound
  6. End Sub
复制代码

谢谢你的指导,稍后我会认真理解你的图意的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-30 14:35 | 显示全部楼层
laiwatch 发表于 2020-4-28 18:39
不清楚你的问题的具体是什么.......这些文件就是wav格式的, 你可以在temp文件夹下找到这写文件,然后随便一 ...

这两天没看到提醒的,好像我的这个功能被关闭了,郁闷,老师,不好意思,迟点回复你了。

说实在话,我对@小fisher的程序还是没有理解透。我对你的话好像也没理解透,明明我已经调用这些api,分步运行没有什么问题,问题出在哪里,不一定和@小fisher的一模一样吧,api我调用的不少。我模仿另一个程序,包对象导出文件、音乐文件播放,成功了。
文件太大,传不上去,代码我已上传,还没到。请老师指点,谢谢。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 03:17 , Processed in 0.037729 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表