Board logo

標題: 請教在出MsgBox同時出音效 [打印本頁]

作者: cdkee    時間: 2010-10-5 17:22     標題: 請教在出MsgBox同時出音效

音效檔會是.WAV和.MP3,在出MsgBox同時出音效1次(即是自動open and close),不會出現播放程式,請教大大可以怎樣寫,謝謝!
作者: cdkee    時間: 2010-10-5 17:25

本帖最後由 cdkee 於 2010-10-5 17:35 編輯

小輩剛剛看到這個
http://forum.twbts.com/viewthread.php?tid=89

自動播放音樂、播放一次、隱藏撥放器
<embed src="音樂網址" autostart="true" hidden="true" loop="0" volume="100" width="230" height=45>

請問怎樣寫才對,謝謝!
作者: cdkee    時間: 2010-10-5 17:43

MsgBox "testing"
embed src="D:\test.WAV" autostart="true" hidden="true" loop="0" volume="100" width="230" height=45

試了以上方式,但不成功!
作者: oobird    時間: 2010-10-5 20:22

Private Declare Function PlayWaveSound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszsoundname As String, ByVal uflags As Long) As Long
Public Sub 播放()
    PlayWaveSound "C:\WINDOWS\Media\Windows XP 啟動.wav", 1
MsgBox Date
End Sub
這樣運行看看。
作者: kimbal    時間: 2010-10-5 22:04

順帶一提
http://forum.twbts.com/viewthread.php?tid=89
提供的是網頁代碼, 不是vba
作者: cdkee    時間: 2010-10-5 22:42

Private Declare Function PlayWaveSound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszsoundname As ...
oobird 發表於 2010-10-5 20:22



    跟版大的終於得了!謝謝版大指導!
順帶一提

提供的是網頁代碼, 不是vba
kimbal 發表於 2010-10-5 22:04


怪不得試了多次還是不成!謝謝版主提醒!
作者: cdkee    時間: 2010-10-5 23:20

回復 4# oobird

跟版大的指導,小輩找到這個:
http://www.mrexcel.com/forum/showthread.php?s=3464d8119ec73df3b5d9ad1d3899c5ca&t=6747&page=2

The Public Function >

Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Is a function call [Look up "Function Statement" in the VBA Help files] to a Library file, in this case the Windows Multimedia Dynamic link
library. Within this dll (Dynamic link library)
There are various other functions (made in C / C++) that work
at the lower level of programing, these calls or libraries of calls
make up these DLLs, and are most commonly documented using C language
syntax. To call these procedures from Visual Basic, you need to translate them into valid Declare statements and call them with the correct arguments.

So bascially Dlls are libraries of procedures that applications can
link to and use at run time rather than link to statically at compile time. These procedures are sometimes referred to as the Windows API, or application programming interface. You will see alot of these API calls
on this site. An API is exactly as its acronym suggests, an interface.
Just like the interface between your screen and yourself is the keyboard or mouse, so the undelying code just translates your actions
to the screen....everything between these 2 is handled by Libray files
that call other functions to perform actions. You use API while programing in VBA, you just don't realise it...the VBA just acts like
a translator in converting your code to the approprate Op codes so that
the underlying library files can perform some action/function.

The plus side means that the libraries can be updated independently of the application, and many applications can share a single DLL.
The down side is that if you get it wrong you may not recieve an error
and/or your system will become unstable or crash causing you to reboot.
Always good practive to constantly save when working with APIs.
Also can be differcult to debug your program, infact you can't debug
API calls in VBA.

Have a look @ your System Dir under your Windows Dir and you will see all these files, so Windows is comprised of DLLs, and other applications call the procedures within these libraries to display windows and graphics, manage memory, or perform other tasks. There are
numerous libraries and associated calls, APIs.

Now to access these library files or APIs you need to how
to declare a DLL procedure, you add a Declare statement to the Declarations section of the code window. By declaring the function,
you tell VBA where it can find the function.

If the procedure returns a value, write the declare as a Function:
Using the winmm.dll call to playsoundA does return a value;
A value of nonzero means the function call succeeded.
Zero indicates the call failed.

Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type

If a procedure does not return a value, write the declare as a Sub:
eg.
Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]

As per Std Sub Procedure set-up DLL procedures declared in standard
modules are public by default and can be called from anywhere in your
application. DLL procedures declared in any other type of module are
private to that module, and you must identify them as such by preceding
the declaration with the Private keyword. Procedure names are
case-sensitive in 32-bit versions of Visual Basic. In previous, 16-bit
versions, procedure names were not case-sensitive. (VB and Not VBA)

Lets look @ the above Function;

[Lib]
Specifying the Library
The Lib clause in the Declare statement tells Visual Basic where to find the .dll file that contains the procedure. When you're referencing one of the core Windows libraries (User32 [user interface functions],
Kernel32 [operating system kernel functions], GDI32 [graphics device
interface functions], and shell32.dll [Windows shell functions]), you
don't need to include the file name extension:
eg.
Declare Function RegisterClass Lib "user32" Alias "RegisterClass" (Class As WNDCLASS) As Long

For other DLLs, the Lib clause is a file specification that can include
a path:
Declare Function lzCopy Lib "c:windowslzexpand.dll" _(ByVal S As
_ Integer, ByVal D As Integer) As Long

If you do not specify a path for libname, Visual Basic will search for the file in the following order:
1. Directory containing the .exe file
2. Current directory
3. Windows 32-bit system directory WindowsSystem32
4. Windows directory Windows
5. Path environment variable

In most cases you will see API calls with No explicit path
as you would use the core window library files which are located
in your system dir.

So in the above example we are Looking @ the winmm.dll

sndPlaySound = The name by which Visual Basic will refer to the function everywhere else in your code. You can make this any
name you want (as long as you use the proper Alias clause), but it's
safest to make this the Actual name of the function in the Windows API

[Alias]
The Alias clause in the declare statement is needed to specify the
correct character set. Windows API functions that contain strings actually exist in two formats: ANSI and Unicode.
It is the A @ end that signifies this in "sndPlaySoundA"
The Unicode version ends with the letter W.

In the Windows header files, therefore, you'll get both ANSI and Unicode versions of each function that contains a string. have a look for winmm.dll and right click to select Quickview, you should get soemtyhing like this;

Export table
Ordinal | Entry Point | Name
0004 00012d0 CloseDriver
0005 0008db3 DefDriverProc

etc....listing all the entry points or LP Long pointers to the
various functions with in the library.

Now for the Arguments and Types;
(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

lpszSoundName = a string that specifies the sound to play. This must
be the Fullpathname. If this parameter is NULL, any currently playing waveform sound is stopped. ie To stop a currently playing sound then
send the VBA Const VBNullString and NOT "" !!

ByVal = when a value is passed ByVal, the actual value is passed directly to the function, and when passed ByRef, the address of the value is passed, so you may see something like LPWORD which is
actually a Long Pointer to a memory address.

As String = value passed is a string = the path name to the sound file

ByVal uFlags As Long
The function is expecting some Flags to be declared here as the data
type Long (Look up data Type for Long) =
Long (long integer) variables are stored as signed 32-bit (4-byte) numbers ranging in value from -2,147,483,648 to 2,147,483,647. The type-declaration character for Long is the ampersand (&).

As for the Public Constants
Public Const SND_SYNC = &H0
Public Const SND_ASYNC = &H1
Public Const SND_NODEFAULT = &H2
Public Const SND_MEMORY = &H4
Public Const SND_LOOP = &H8
Public Const SND_NOSTOP = &H10

What does "&H0,&H1,&H2,&H4,&H8,&H10" means??

The function will recognise various Constants or flags that tell it
how/what to do eg.
Flags for playing the sound;

SND_ASYNC
The sound is played asynchronously and PlaySound returns immediately after beginning the sound. To terminate an asynchronously played waveform sound, call PlaySound with lpszSoundName set to VBNullString.
SND_LOOP
The sound plays repeatedly until PlaySound is called again with the lpszSoundName parameter set to VBNullString. You must also specify the
SND_ASYNC flag to indicate an asynchronous sound event.
SND_NODEFAULT
No default sound event is used. If the sound cannot be found, PlaySound
returns silently without playing the default sound.
SND_NOSTOP
The specified sound event will yield to another sound event that is
already playing. If a sound cannot be played because the resource
needed to generate that sound is busy playing another sound,the
function immediately returns FALSE without playing the requested sound.
If this flag is not specified, PlaySound attempts to stop the currently
playing sound so that the device can be used to play the new sound.
SND_NOWAIT
If the driver is busy, return immediately without playing the sound.
SND_SYNC
Synchronous playback of a sound event. PlaySound returns after the
sound event completes.

The values; "&H0,&H1,&H2,&H4,&H8,&H10" are the Long Hex values of these
constants eg.

&[Long] H(Hex) 0 or &H0 = 0 Decimal
&[Long] H(Hex) 10 or &H10 = 16 Decimal


API calls are very useful when you require commands taht are not
provided with VBA. By calling procedures in DLLs, you can access the thousands of procedures that form the backbone of the Microsoft Windows operating system.
作者: et5323    時間: 2010-10-6 02:42

彈出MsgBox,系統本身就有音效的嘛!
作者: cdkee    時間: 2010-10-6 23:09

彈出MsgBox,系統本身就有音效的嘛!
et5323 發表於 2010-10-6 02:42



    請問大大在那裡可看到?
作者: oobird    時間: 2010-10-6 23:47

msgbox 是用這個聲音。[attach]3033[/attach]
作者: cdkee    時間: 2010-10-6 23:52

回復 10# oobird


    又多一點知識,謝謝版大!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)