|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
# c/ O. k6 l4 f5 WBy Mukta & ToxicDream
# O5 K6 B2 Q3 T- //for delphi 5
) B* X! j4 Z, X3 @ - unit MMDevApi_tlb;$ ~8 ^; B, ]7 O- m! Y3 W+ ]
- ; T5 v4 I: O5 L8 L, e
- interface. R( |0 U4 X9 Z: [1 ?! U# `& j
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;9 `3 b. w" I$ Z, W$ a2 t
- const$ V9 C# [* C8 p0 Z
- // TypeLibrary Major and minor versions
4 x6 ?( a% R H
& e+ y" q2 p9 o& O4 b- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';5 `) @, l. R- R' O+ v, t# S7 X
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';7 _3 U. Z6 b/ W: B9 e# S9 o3 G1 C
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';. x& Z1 r0 j; O; n* `
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';9 y. g8 w" w5 |
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';5 H* h8 S. g( w3 q' ~" x( m
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';+ u1 e% n3 f* W6 i6 R
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';7 u9 ]9 Y% W8 ]7 c0 c+ V
7 W% m! L4 \1 `- h ^1 U* G# \2 q- DEVICE_STATE_ACTIVE = $00000001;
# a- w3 _- r* w) ~6 e* T - DEVICE_STATE_UNPLUGGED = $00000002;
' }; e2 U0 A3 l: l q2 L" m4 M - DEVICE_STATE_NOTPRESENT = $00000004;
, y; ]# c& Z, E3 u ? - DEVICE_STATEMASK_ALL = $00000007;
8 c& P7 g9 n+ E, e - & R8 t2 F1 I7 [# R L
- type9 G+ M8 B- F# `. b
- EDataFlow = TOleEnum;' q( T& @1 J h6 \( Z
- const
7 \% k- x2 w5 E9 E - eRender = $00000000;
$ l2 X# ^* o. g( S5 Q1 A: g) Y3 j - eCapture = $00000001;# q! W O9 y: T# }
- eAll = $00000002;3 t% Y! ?6 }- C) j: o/ ~5 }
- EDataFlow_enum_count = $00000003;) H D8 V% @1 P3 N! }% w/ r4 t
6 M/ v% [7 S- e. a, @- type
8 z {# E4 u; y/ ^ F - ERole = TOleEnum;
$ [/ {9 b5 r2 B0 r" i& Y - const
! z. C, D! q5 s5 g - eConsole = $00000000;
9 v# Q& @1 i4 @, y+ O2 Z% c" B3 M) F - eMultimedia = $00000001;' U1 k2 R3 y% \4 m% I
- eCommunications = $00000002;
' m# a9 P% F3 m - ERole_enum_count = $00000003;7 C8 z) t: h1 G3 ~- V4 |6 Q
. u: c1 @, a' B8 w8 A- type
; O7 m1 f& M& B# E& t - IAudioEndpointVolumeCallback = interface(IUnknown)
7 f$ T) j: f3 \ - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
3 g" I6 w$ R2 @6 H - end;
: k! f' G$ f& |1 x
- h& c! |% I8 j7 {) R- IMMAudioEndpointVolume = interface(IUnknown)% t! V5 m# d7 ] v) j& K
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']: L3 x# w8 t$ j+ B- g
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;1 u: Q# x3 j$ N4 V H* k+ w# E* b
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;# v o- ]. x8 |# q" D3 |) N
- Function GetChannelCount(out PInteger): Integer; stdcall;' v4 a" j, Q+ P) b/ ~9 X$ c5 J" p# |9 n
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
' j6 V4 p* K# J6 m, z: t - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
: u! s: V" x% y3 n - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;' t( P: U6 g0 A( f1 L8 ?: S2 g( s
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;1 _2 {& K% i* Z- h P2 l0 |
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
2 \; z/ |, S8 }; E# G7 p - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
& _4 a7 W/ \6 B/ ]6 Y - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;! _4 L& u8 v1 H% @4 B
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;% j( O5 L \4 f+ q$ t% p# u
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;2 m# X% X& M. Y" z8 \- m
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;% B2 O4 t" Y, g* c3 q- W" h/ v
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;! ~: l; t5 }6 o- _8 ^% B0 b) S
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;+ Y. B' K# }8 A8 t7 Q3 k
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;( ]6 E" x: v) y* }$ P# @
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;4 |. |9 j+ F6 l' v7 v6 t: N) w
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
( f* J- A5 ?2 Y0 f' Z; o2 C6 R - end;6 Z9 W0 S! ?1 G0 X$ f
+ e4 I2 N) ~ s2 {9 G5 E# @- { IAudioMeterInformation = interface(IUnknown)
& J8 S, ~3 ^9 o- x - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']4 `" w9 f `& u7 |
- end;}
4 W" u6 c9 D; B4 f+ _3 f% @ - % d! B* k% R4 l% _, x( K1 ]* C {
- IPropertyStore = interface(IUnknown)' v% M# V) C" D
- end;
1 n6 d! _$ q ~* W, w" @ - , }& }3 Q9 \( V) u/ e: f7 E( x
- type
7 u6 \9 }0 H1 y* f& ^ - IMMDevice = interface(IUnknown)
4 w. H1 z% ^! T& s - ['{D666063F-1587-4E43-81F1-B948E807363F}']5 X9 B# W. u o& P
- Function Activate( refId :TGUID;8 c7 F& U8 X+ Z/ l
- dwClsCtx: DWORD;
% d" j, W3 g* L8 T - pActivationParams: PInteger ;
3 T m2 `3 ]! {, v& e - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;# y# K4 p8 R) n* S5 G- ?
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;& K% F1 r! Q! }0 R) [ a
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;9 T8 C) W) _ i( d' Y0 f. C
- Function GetState(out State :Integer): Hresult; stdcall;
: _6 Q8 \4 M: q
/ r" G& W' R$ w9 N1 i K- end;8 y8 E) D# z& M5 a+ N/ D
- 7 M% B( E7 {8 \8 q! W% M+ e$ j( B
- ! I9 a( B( s$ U' G5 j1 y% G
- IMMDeviceCollection = interface(IUnknown)
$ T& e5 S3 |& c/ V% p - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']$ X8 x9 y7 T% s) A4 S- a
- end;7 ]' G: o* p9 v
- , G2 H& G+ c+ F% Q0 |, Y* l8 D
- IMMNotificationClient = interface (IUnknown)
3 x! @- V( h3 W$ v - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']" \( \7 h( O6 S2 ~( P) Z! ~$ v& D
- end;
* O4 }* U1 S) Z% M* {% e1 b - / W5 v1 q6 I8 |' j# m
- IMMDeviceEnumerator = interface(IUnknown)
, c* Y- N& b+ t+ ^! d) L - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
: ^7 a2 i( C$ R4 t2 B - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;, ~0 n- O1 |! S) v
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
; F" V' s7 V k - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;, M) S- h8 P: [0 \4 m
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
, R7 }/ C, ]4 [; n - end;. L" _6 L4 ?/ a. B
0 N! u3 ^- r" b" _1 B. M% ?- implementation- A! s0 q/ q# f
- end.
5 I. z# B% T8 b! v( a% S - / ?2 J- J/ ]2 F" @- G
- Thanks & Reagrds,
" W7 U. I& g" @9 R6 [( g - Mukta ...! d- Y) k& ]# q! ?' T; G0 Y3 R
复制代码
$ a) J3 _; y1 b& L# s4 Q0 ^4 g: b- it's work in Delphi 79 F$ }" f5 |% W! a, e- i2 d; f* q
- //////////////////////////
9 X9 a8 X* F/ `2 w% @$ |# T
& {% B& U0 v F% L- unit MMDevApi;
1 _1 G9 P5 V' w - " Y8 ?' j; d& b
- interface
; G3 G3 F+ l6 s* H4 W* C - 6 U. Q4 P+ a/ V/ c, ?( D
- uses
8 B+ a+ E2 c" I% K6 T' V% J - Windows, ActiveX, ComObj;: O" _0 M8 |+ b6 K6 `% |
- 8 b, o( @& G2 U
- const
" O @; l+ s$ a5 y4 W' M - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
- {1 u" n0 q9 b4 k$ f' c' ~% H3 Z - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
( ]% j; F" Y( t( p, P - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';- f) c6 J: a' x: R; g& d9 g3 `' k- Q3 ~
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
. j' _: R- e1 \8 F/ e- G - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
, S* L3 W* ]! f- a' I' { - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
0 }3 [3 M, I+ T/ d - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';3 a1 x) X+ h: q: x+ Q. h3 q8 ]
6 U3 `+ r$ m) w- _- DEVICE_STATE_ACTIVE = $00000001;
+ P2 ?5 o) Z1 G, U3 f) V8 ^ - DEVICE_STATE_UNPLUGGED = $00000002;# L) c1 H% K9 Q/ G1 m) t
- DEVICE_STATE_NOTPRESENT = $00000004;
* i: }- ~8 w, F6 ] - DEVICE_STATEMASK_ALL = $00000007; c! t1 P/ V4 }4 i: d
& ~; Z, B% |1 h( P/ I- type
8 m6 c7 J3 h, B - EDataFlow = TOleEnum;+ z! V& i4 D, N; L) a
% Z K$ G O% s- const
( w. D+ B3 D/ g - eRender = $00000000;
# ]$ m1 @+ x) {1 q - eCapture = $00000001;3 e) Z) v8 v) G- N
- eAll = $00000002;% E% f! g2 A `$ o/ Y
- EDataFlow_enum_count = $00000003;) o K0 Q0 w0 e7 }* d5 T
E' K' ?# [0 F) \9 K/ @- type
, ?, i6 F$ H: h- C - ERole = TOleEnum;
# H A q$ _* C& F% \1 v, M - ; {8 {4 Y, @: y6 a; K; x
- const
8 t# \; j3 y+ z- f, j% {( w$ t - eConsole = $00000000;
, O7 q( N, n; y( ~! N* B$ k - eMultimedia = $00000001;
* W1 |3 B4 g& o/ m6 n- Y - eCommunications = $00000002;' o V ^9 _+ H7 _( b$ t
- ERole_enum_count = $00000003;1 w, K5 Q1 n% y e" `
% i* @; t% ~3 C& s3 s- type; I9 F S7 N5 {% |3 x; W& m1 Y
- IAudioEndpointVolumeCallback = interface(IUnknown)1 D. B4 m M7 Z+ Q4 t( Q2 B
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']1 o) j4 \) V8 d6 L }
- end;5 f0 n8 s" v8 P4 ?% f
- ; [7 i5 A: k% F4 U, f, R
- IAudioEndpointVolume = interface(IUnknown)
9 V+ f, Y8 \) m( W7 S; K/ T - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
; B$ c% l3 ?1 B3 i) \8 I. T1 X - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;' U P- w8 q) R8 t
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
0 m7 Q, v: W2 B F - function GetChannelCount(out PInteger): Integer; stdcall;
' x1 Z7 q9 j$ t/ l0 I- a* I - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;6 x3 Z6 W9 S. e+ a0 b
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
8 K( D2 V+ W8 q( M8 Y - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
6 a2 ~/ r* L" L5 D0 M2 l - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
' K, q1 J3 z$ G5 G5 f+ d% Q - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;7 w( M* I( m/ b2 l
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
7 l" x2 u6 s6 r4 G - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall; N& C1 {! f2 S
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
( h, ^% y/ u3 C/ h7 G/ C - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;) r B/ j7 X$ e! `
- function GetMute(out bMute: Boolean): Integer; stdcall;
3 M4 H- m) {# x/ l - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
# \# t+ Q3 F( u& I" ?8 M* N6 s0 u$ D - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;9 q4 L8 d( O0 d2 B; {, \ O0 ]; L' a
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;. O# F$ B) c6 {% D) L- U0 O
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;) B+ j1 V6 l6 g
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;( R c# T {9 p0 }/ P5 y7 [* N
- end;" h5 v% p; W$ V1 }3 s& F! D
- : m, u7 Z4 V0 s6 L+ T
- IAudioMeterInformation = interface(IUnknown)9 V7 Q- C7 p; W. x m6 |
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']! D2 ~' |8 {$ R- \6 e8 q
- end;; `$ b9 [, B" u3 m }8 s
- ; m% M1 p' d: N% q/ q
- IPropertyStore = interface(IUnknown)
5 n# k) k" b8 |9 V - end;
9 i9 M3 Q2 {. N) g8 n
8 M l- y6 D: d# ~; C% }3 I- IMMDevice = interface(IUnknown)
d8 ? w/ N* O. k, H* k# [ - ['{D666063F-1587-4E43-81F1-B948E807363F}']3 t- N6 f V5 K( @8 O K
- function Activate(const refId: TGUID;0 k" D: q! u/ I. G( C4 q4 A' L
- dwClsCtx: DWORD;6 V# c( L4 E/ ]5 z) \5 E; S
- pActivationParams: PInteger;1 n9 k a$ m2 J' {
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;% T- T) h, ?9 i' p( X2 ?( B
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;# [+ T) F1 ~ z2 a2 c- s- K
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;- b% {" d- O7 Y( O, F g/ n1 D
- function GetState(out State: Integer): Hresult; stdcall;
Q7 W# M- B8 N( B - end;! }6 B0 A2 k. x1 e6 C
- 7 I/ o+ x9 L" v0 t- n: d
6 k% r* m6 u; X$ O! |' X- IMMDeviceCollection = interface(IUnknown)0 u7 R* \' n# I* S" q- M p+ l) [
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
8 ?( ^ B* s3 M3 }9 B - end;& {2 P, c" c" ~8 i3 ?6 l* H) }' l" x
- 7 E% F. B9 ?3 ]7 Z* w
- IMMNotificationClient = interface(IUnknown)
- t* Y1 b2 Y6 j7 X5 b" J( U - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
5 M7 x; }( m5 r9 E* }/ p% r* r - end;/ ?/ ~& u( i0 Q1 J) R
, I: Y# h: b/ a( V& V6 g2 Q4 P- IMMDeviceEnumerator = interface(IUnknown)% a9 q7 o3 E$ j$ u l# P1 O, C
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']% `0 W" l# V6 A8 a; E- t
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;' u! W% I6 U2 f2 v# `0 ~
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;, D- S0 I) [$ a
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
( h! j4 v' z6 t" o. ] - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;! _' L# c7 A+ ?
- end;
5 V! J$ a" D0 M" ?, f" f( e
0 g3 \+ S9 n# ~( s, A- ? s& m- implementation
5 V7 u8 Q( B q/ M m - % U+ _2 i- |" t. o1 V
- end.' J: M, n8 m* X1 N! B
- ' l5 z0 e) n0 u, e9 o; s
- ///////////////////////) V% w( z" `6 q2 Y
- simple sample :)/ k9 d# \* h; V; X& _: W* x& g
- ///////////////////////
0 j/ j+ W- _' G4 s! \, u$ o4 Y: a' U
8 Y; G( t- f6 d) f- //...... other code
3 m$ M5 t$ a5 V: ~' ^+ g' v4 \
2 q( `9 p3 Y' O- uses ... ActiveX, MMDevApi, ...; A% E: b% A: d$ _* B5 b
) I0 F6 C1 y& @9 m( |% y, R- //...... other code J. P# m* d, k' @" i
8 l9 W6 |7 \. l% J6 I5 z- var
4 W9 Y7 p1 H! R G3 h5 h - endpointVolume: IAudioEndpointVolume = nil;: |. c2 v& ?# V7 D/ Y7 c; [/ }9 `
- ( S; c& O* z3 ^' J
- procedure TForm1.FormCreate(Sender: TObject);3 l _3 C6 X$ r2 l9 `% r
- var1 k* g4 C. t2 X7 N
- deviceEnumerator: IMMDeviceEnumerator;+ d1 D2 \# ]8 ^6 J2 p
- defaultDevice: IMMDevice;
( [# u+ [. g2 E4 w' G5 m - begin" p) J) i) P! U0 S) P6 G# b8 P
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);7 l* N/ B0 K5 R. Z; Z/ K4 x0 Q3 Y
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
8 P4 ^$ A. c0 `, e( y2 y" h - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
% ^# H- \! E+ C8 ]# Z9 N - end;% ^. Y) j2 T" x
% }; f( ^ X3 b( H8 v s2 `- procedure TForm1.Button1Click(Sender: TObject);
, T3 X; [1 C4 u+ q4 ?! a - var
6 V) f1 L$ c, X' f - VolumeLevel: Single;
+ f' i1 ]" j% F g0 I1 _' v - begin
# b: U9 ~; o3 J" @! C - if endpointVolume = nil then Exit;, y8 ? V0 v5 U9 J
- VolumeLevel := 0.50;* e' F; i& U' E) z
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
9 q3 A7 a; x) s$ H - Caption := Format('%1.8f', [VolumeLevel])) {; t+ F0 A9 @! A+ j
- end;% s8 x9 |! V/ Y- R! A
) `6 x/ a8 [8 l! S8 @" U2 z- /////////////////////////////////////7 l5 ]3 `- R# q( F8 s! d/ B
- $ P# l% _3 J4 G; d3 T2 V
- // with best regards ToxicDream' Y8 T( @' C* g: p
复制代码 |
|