|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0583 O3 Z9 H3 x. `* T4 U! h! g
By Mukta & ToxicDream- . q1 [3 h) H) }+ W5 j/ `
- //for delphi 57 c( W; R& n+ r5 {& b- A
- unit MMDevApi_tlb;+ n# P' s- K1 z8 u: _1 g
, S" P+ S- g+ {0 K0 c2 s9 s- interface g& }0 x2 c9 J5 V8 j# n- Q W
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;! p/ |7 c2 m0 X% S, z
- const
8 q0 z$ |* v$ D2 P# i - // TypeLibrary Major and minor versions: B. I* s- `' p) w4 @; p; K
/ c2 s# q7 N+ ?' Y) Y& ^8 \4 d, G- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
7 C1 {. D8 S3 Z/ @: Z F - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';6 R3 K# A$ l" D+ W( m! Z: J
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';2 m8 e0 |' n- p% c. Q
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
8 l4 Z/ ]) J$ `) \ - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
& `7 Z* R# J2 p8 y6 ?2 ~. ?) Q - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';* J' c( o$ Q% v( y: L
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';2 C' Y- u: a& _; Z
8 h# Y, N2 @9 J& {# U- DEVICE_STATE_ACTIVE = $00000001;
O9 J0 K: h2 ^$ r# H8 u - DEVICE_STATE_UNPLUGGED = $00000002;* K6 k8 r/ @: y
- DEVICE_STATE_NOTPRESENT = $00000004;
: R0 v7 \" G" k$ |9 J! O' V - DEVICE_STATEMASK_ALL = $00000007;
, v3 y' C& K1 E9 R! ?) J
# a. n8 s; Q: X) i9 d7 d5 [- type9 C& j! D6 ^0 G- M1 z/ Q
- EDataFlow = TOleEnum;
+ F, n0 O, h) J; u - const
% i& M) ~7 Y P - eRender = $00000000;
7 J, ]- [ v" _3 V+ I# h8 g - eCapture = $00000001;# l2 B. T$ Z5 h9 H0 F* B" P/ p
- eAll = $00000002;, ^& b' \3 ~% q" A0 k
- EDataFlow_enum_count = $00000003;
0 [% F+ o, r% w) [; M1 S
- q# N. p9 g0 n' {9 C- type
# G3 E- m5 E; {7 O1 s* Z - ERole = TOleEnum;' @; H0 u, u* o9 M* r
- const' Y7 n: g( N9 c4 z' h
- eConsole = $00000000;
7 J$ m' J4 E0 u2 ^ c& @8 m - eMultimedia = $00000001;
+ n9 I* o) p0 P7 ? - eCommunications = $00000002;/ f, q' Y! Q- C# t. T$ }, }( @
- ERole_enum_count = $00000003;
8 _4 X8 C! x d$ e0 Q1 n
0 W8 q# i# t' O/ J% \- type* C) s( N } g( p
- IAudioEndpointVolumeCallback = interface(IUnknown)
* F) b% h5 g0 y5 a/ m5 c - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']9 Z7 w. H. R u% g/ f) x9 `
- end;
k& ^0 m0 D7 w1 Y! r2 K2 s
: J7 m7 s8 e: b) u+ ?- IMMAudioEndpointVolume = interface(IUnknown)
! U2 q# o b- v+ ]5 m - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
% I% J: O4 t1 a) H - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
+ b: l; ^9 C- m0 O2 I - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;& a$ C( W @/ X0 n d
- Function GetChannelCount(out PInteger): Integer; stdcall;
( P; n5 O! X, @/ s - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;" A: C% R4 M/ L. h) m( ?6 a2 W
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;5 h, J8 S; p$ M% ~: d9 f$ g$ J
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;5 i) ]; u2 F. t1 U' ~* p
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
' H ?! I+ d$ I$ e7 q6 g% o' E - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
2 X) G7 E$ j! u$ ^) x5 M7 U - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;& `2 Z0 m* z. M) v
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
9 m4 @" I' m: }8 H" q, w* d7 \ - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
$ o: c$ e6 c& _1 c @% Y& [ - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;: g, t' t' `6 L( F( o: H
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;- N2 ~9 d& ^* D+ c4 C
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;. w9 z' C: q3 f3 U" @/ L
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
) w/ ~6 t; x; i$ ^ - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;2 a+ K# o6 O% K ^
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
! e1 u9 t8 K6 ^. Z! a5 I: o+ E. Y - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
# A9 P f2 b8 I - end;
; O6 Z) G1 A( [' `: U# j" ] - / q+ G- u& |. \7 c, V5 E4 y) f
- { IAudioMeterInformation = interface(IUnknown)
# h9 r( h7 q4 Y6 E" ?" S - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']3 J) g0 U+ x& D) \
- end;}0 p7 P* G t& i
* D0 W4 K+ P6 `2 ~- d( x/ _* x- IPropertyStore = interface(IUnknown)
- _& s3 }# D' Z8 t3 Q4 w - end;0 Q0 F( @% A5 W
0 A) m) j# ~* f: H8 A- type
" p( V. x. F* o! a! k - IMMDevice = interface(IUnknown)6 D6 n, u" W" m7 s3 p% \0 U
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
6 t: U, C2 M( r ]' X - Function Activate( refId :TGUID;4 G6 @; c+ F6 r; J' x
- dwClsCtx: DWORD;
! U$ u# H/ z8 M; x4 K" I - pActivationParams: PInteger ;& l h% r$ ^* A: L9 c7 k( u# }
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
5 N. A* x& | |, g# D# U# M8 E/ n - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;% u$ e7 V' R5 G. T1 f4 ]# ^
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;8 J2 ^9 D1 d1 E+ @1 `; S( c
- Function GetState(out State :Integer): Hresult; stdcall;
' i P5 d" Z1 @5 E6 e( M5 { - 8 N2 b4 ]$ U/ r4 E M' l
- end;7 A. e+ c" _0 N
3 Z$ R* v* }9 M0 U- 4 a8 y* k& j6 o7 a( ?8 ]
- IMMDeviceCollection = interface(IUnknown)* T1 ]0 |( h5 S9 e6 j
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']9 d* r. H( N$ K. g
- end;
7 f$ H; [/ ?; u7 G2 h# B
2 Y: E4 b: S# a4 ^) k; e1 e- IMMNotificationClient = interface (IUnknown)7 d- R! U& x+ @5 W- v
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']3 M! M, P1 q& x9 C4 \
- end;) z% a. m0 O3 H; t: Y7 j6 Z
0 T5 \! D0 m: g d+ c1 g* x- Q+ q0 m7 Z- IMMDeviceEnumerator = interface(IUnknown)
/ \! m1 ]$ Q3 e: k& j, \ - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
/ w. N* M( l; b5 |3 k6 i& o7 d2 X9 c - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
* J% e6 o/ ^2 n! W+ m& l! R - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
+ O, [+ z; X. i% ~* u - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
9 `& b0 E2 L1 _5 T( u - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
0 {0 _( l- Z7 N - end;) N: W+ [7 E# ^ d) [8 A& C
- . r: \6 B' g; k. ~
- implementation
Y- K% x0 Z! O& I$ X s - end.
5 u5 M3 i* X# p: w& H - + c# Z6 }1 ]; }, R9 s) y$ U3 d$ Y
- Thanks & Reagrds,
+ p8 q. G& V0 f% a: u: d. K2 X; F Y - Mukta ...
1 y/ K" h" V4 f$ T: C# z
复制代码- 4 C# t' a7 v0 b6 b/ Y2 @* a
- it's work in Delphi 7. J5 [" R8 I2 @$ A$ D
- //////////////////////////" y4 X! C. r( @* h7 `( n. x
# a5 s9 s) L5 m3 O5 y- unit MMDevApi;) M; Y y9 K9 o7 T
- # P5 T: `9 _3 M s n* c. \2 f& T3 H+ N
- interface# ?: T3 \4 X3 P. d, T9 t% O
8 j0 }$ x( w2 @- uses) V# [0 R" j9 D
- Windows, ActiveX, ComObj;2 j( `3 E" c v) d
0 J$ ^ H! a* H% g- const
, }6 Z; A% H9 A; o! z! i9 U - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
8 Q7 `1 F1 A: ?+ K - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
" R5 L1 ~, {) d3 o' H- T - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';6 P5 r) p) d$ B' @! r, T
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';: `$ n1 Z& p9 b5 @) Y1 _
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
: h2 `. \- I, K- V' H8 V - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
, d$ a( e: w: I* ` - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
( I8 m6 o% M! f0 B1 W6 ?- K - * B0 u7 O0 ?' d2 B9 g! I0 b6 V% l+ E$ g% P
- DEVICE_STATE_ACTIVE = $00000001;
, B% D; n9 ?/ K) u' p/ c/ w. y - DEVICE_STATE_UNPLUGGED = $00000002;8 \! I0 M; U0 r9 ~( h1 f
- DEVICE_STATE_NOTPRESENT = $00000004;" q' f6 B8 s: [' D$ o2 V. R) k$ R
- DEVICE_STATEMASK_ALL = $00000007;1 P r& w& w' E/ |, S2 N' L4 D* t
3 c; _' f/ L3 h/ S- type: g! K5 r9 l- @$ I
- EDataFlow = TOleEnum;
4 G/ X Z) G% [' J, {% {) { - : ^/ Q5 Z: B7 N' K
- const0 ~& m/ c: j! R
- eRender = $00000000;& p6 E* l, q& H/ o, t
- eCapture = $00000001;# d, Q- ^/ k6 P) @ i6 I& h- b
- eAll = $00000002;
) n' a5 K* D1 a/ {2 \9 q6 V - EDataFlow_enum_count = $00000003;4 _- k/ E2 W- e" e6 H, ?$ n
- . T8 j8 \" |2 v" n# }3 k( w8 p3 [
- type
- o9 i3 P* a0 n - ERole = TOleEnum;
; _. m2 P+ z3 x; G2 F3 J - 3 w. D" d3 [ Z
- const$ {0 X5 l! V; k
- eConsole = $00000000;
: O0 F1 n; y" x) e - eMultimedia = $00000001;8 x! s2 w, f) R$ n
- eCommunications = $00000002;
: y2 o2 j, v/ t2 d, G; S - ERole_enum_count = $00000003;
' w4 ~' f, q8 I9 M4 p, j; M
, q; c# s; j& g8 n- type
% ~# c6 I' G: _: ]) a/ P - IAudioEndpointVolumeCallback = interface(IUnknown)
% M8 }+ Y) a4 D% N3 [/ @ - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
$ k0 R. e# W" L s2 q- Y - end;( k2 l* W# D% ]% g3 k
- 4 ?! c" h- {* _" J4 ?
- IAudioEndpointVolume = interface(IUnknown)
% W0 Z) {. h# `1 u% b - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']0 s( ^6 ]! @! w& v3 V i
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
0 d3 F$ o6 z+ x% a1 `& `" B/ P5 x! b - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
$ D( U% u/ r* |6 A - function GetChannelCount(out PInteger): Integer; stdcall;7 j+ M" K/ P0 Q5 M- }- R
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
* m* J s& ?. ? - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;% r6 _9 s# v$ }; U `
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
- K+ ?* k3 r. ]$ O- }8 f* _8 q - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;9 | Q O& Q( W( j9 {/ g. F/ r
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
4 i* x- T; C% P$ v& }& T - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
9 f- }* n6 H5 C X3 n - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
: k: p9 b5 G. ?: e1 w - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;4 q. X% R) k7 Z3 Z) L% A+ V
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;0 v2 B. I4 U/ H# _, w" `; _+ w( P
- function GetMute(out bMute: Boolean): Integer; stdcall;
7 j4 N' [ j" T4 u; n# D - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;' u. O) L, E# u
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
: a5 j2 |8 a' ]9 c4 K3 p& ?" ` - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;' Y: m# Z8 u; w- z( T
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;9 d) A" |" @! y6 q4 t4 M* v" x" m" M
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
7 w( }1 `" j1 U7 S) @! {' E& j4 u - end;
4 i" }7 n4 g# |) J2 b$ Y+ J# c1 v* f
' t& p3 ]. y9 F1 C, Q3 t6 F- IAudioMeterInformation = interface(IUnknown)
' r4 ?8 C; J6 \* V: M - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
3 y( T! n- H0 o - end;* b2 @/ w+ L* K
- , _! V# |+ X! D% _. \% O6 N& |
- IPropertyStore = interface(IUnknown)
, [" \& I4 w# K& u- ~ - end;
+ Q, h, a* s) ]' s - : E: u2 ?$ k' w! m' i, L/ ^
- IMMDevice = interface(IUnknown)* h4 o6 f' b) \: m9 S$ R
- ['{D666063F-1587-4E43-81F1-B948E807363F}']$ S$ d' M1 E6 s- _4 {
- function Activate(const refId: TGUID;
" b2 l6 o/ c( t7 U/ j" o - dwClsCtx: DWORD;) x; h* |" z. q+ e1 U
- pActivationParams: PInteger;6 v$ {/ d+ O0 U8 G) f* V
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;+ F5 t# |, z B+ g" q" P% S
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
' N3 P, N- g+ f+ s" Y5 E- J - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;* e e& T& s E- D$ l
- function GetState(out State: Integer): Hresult; stdcall;
4 x5 v! S1 j4 }& [ - end;
|8 z; @# r2 T7 `& e - 4 o0 `1 c7 F" f5 T0 z9 X" e' Z
- ! {2 D4 f" u: T
- IMMDeviceCollection = interface(IUnknown)
8 }3 J( }8 \$ J7 j; G - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']( x9 V9 }6 b# I% ]. n+ c& W7 M
- end;& Y" r! p B! C+ u
) L" |! o0 M5 Q! h# p9 t, b- IMMNotificationClient = interface(IUnknown): X' p3 E w0 R7 m2 i- a( r& t
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
4 B: d8 G$ Z# k! J9 c( |1 M# S - end;/ e; W" I1 w3 s6 U1 S
6 e) ]; @: @9 s c3 Q0 y# @- IMMDeviceEnumerator = interface(IUnknown), K" S: b' g j& n" \4 [
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
+ y+ ^! Y) A, e- \% R% g - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
0 Z. r9 P+ w; _) G/ d% W7 E - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;7 h4 p9 x9 k$ M0 p7 @
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
; K% _- u1 k$ L. P% \" Y - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
- n& W3 \. S. P- \ - end; Z' I& P" ?! _5 W1 g7 R; h- n
- % o- b: ^. [ h. h5 P1 `' V
- implementation' x7 V4 G2 `9 b
- 4 ~+ p0 e. F! ^; F
- end.
- u2 l$ A8 d" [1 Z( r - - J' |: [4 e$ L5 a4 M
- ///////////////////////
: k0 P- {# L% {/ J6 t/ m - simple sample :)9 c' h) i4 G* H ~. C( r
- ///////////////////////
* M# V3 t; I- Z; y8 x1 b. H - % _ Z8 v( R. D) G, D0 G: X" }* B
- //...... other code
4 g( B0 P. K7 ?' v% q! J$ j0 u
+ J4 _1 c2 T, B3 w1 P- uses ... ActiveX, MMDevApi, ...;- F, [, p# p8 `- L
# r! }* k# h9 _- //...... other code
- G: p; Q1 Z% V$ Y* u - % r: n# M9 M( o+ G4 Y# V: F& b
- var
5 J+ M( E1 Y+ C2 o - endpointVolume: IAudioEndpointVolume = nil;
5 x4 i1 L4 f! \+ g - & E' l4 x: e* B9 x& ?
- procedure TForm1.FormCreate(Sender: TObject);3 ~1 a: c: w2 ]& W5 `8 d. N
- var* I* T) {& n2 D4 }% w J% k. T
- deviceEnumerator: IMMDeviceEnumerator;8 _) t1 | k, w2 V$ t& K
- defaultDevice: IMMDevice;: z/ s& q2 b5 u6 a1 Z+ H
- begin+ L0 I! r) X* q+ [7 m
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);8 r5 W# D9 o5 ~( f$ W+ ~0 P& M9 ^
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);) y; d+ P: w$ {$ z; B
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);8 A0 {6 W* V4 o6 z2 X
- end;# q% H- z. c4 M' S& s
- , ^+ R9 j# H, Y3 K& W f
- procedure TForm1.Button1Click(Sender: TObject);
1 |& j7 E4 u8 X! J' N, J! ^$ {1 u - var4 C f' O' N% n
- VolumeLevel: Single;' c7 V' U- \) j! J/ N. L& y' `
- begin
/ g% d& {2 H, i8 M6 b - if endpointVolume = nil then Exit;9 H1 _# s, q- K% p, h! G
- VolumeLevel := 0.50; O' g( w+ Q: ~( U1 K$ W
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
4 a+ y' f6 l- A2 r R1 d+ d4 y - Caption := Format('%1.8f', [VolumeLevel]), i' U6 K) U) C( g( Z
- end;/ C0 t4 }0 {# g$ Q" v
- d, T& v$ |1 Y( B; j- q
- /////////////////////////////////////
& ^5 ?" {4 ^# X* r9 n. o* S& m( s - / g; V( ?6 }9 B5 N. N2 i$ x* x
- // with best regards ToxicDream* W w8 Y* W v* B1 O" }
复制代码 |
|