|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058; X! h& s( y% K& i) P
By Mukta & ToxicDream- 5 ], `8 \& G- z" _+ h, J' [4 H
- //for delphi 5- Y9 S7 E3 n" f4 {: T# K& T z4 M
- unit MMDevApi_tlb;+ Z, }0 v! \: A# c% w/ j. O F# g% c
2 B& X$ C4 }; p8 ?* f, t- interface
) N$ t- d5 C) o% P# _6 S - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;4 W+ u9 a2 i7 @" P& I# ^3 q
- const) }* W; @, k, u" |7 I2 C
- // TypeLibrary Major and minor versions
* q* d# t4 h( ]7 H
: i4 i. D9 H# V+ R6 s- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
1 I: K+ C1 s2 n5 m F9 E& H - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';" C5 I" K9 s( O! u4 r2 `7 o
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
* _& ~; h9 W$ ^: T9 Q - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';( `; ~& o! b* Q- w
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';% k4 W& P3 V j% E2 I
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
" o1 l1 n) r. g) B$ x$ F6 X Q' g - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';3 d2 S3 m. s/ y1 t
- 0 j- M: r* O& N, R7 `2 Z9 o
- DEVICE_STATE_ACTIVE = $00000001;2 o+ M H+ d+ R) X1 w) F
- DEVICE_STATE_UNPLUGGED = $00000002;
: c5 F2 w4 P) O$ K - DEVICE_STATE_NOTPRESENT = $00000004;/ I6 r: b% Q) i( q/ c
- DEVICE_STATEMASK_ALL = $00000007;# z0 Q( p- b4 M6 V( D
- & ^- [0 Q/ b* V2 ]6 j0 F; |
- type
' c6 K+ ^1 H! D. e+ Y* ]& K - EDataFlow = TOleEnum;. f" w# h! z/ K! ^
- const
+ A* Z* v* {7 p' P4 h, b8 Y - eRender = $00000000;/ m# G6 r1 {& q% p; P3 A
- eCapture = $00000001;0 h7 h; {$ g, ]6 F$ W4 q: M! D
- eAll = $00000002;
/ O p7 P o$ |0 P; n - EDataFlow_enum_count = $00000003;
; v5 z, j; }3 ~7 B6 @
+ d$ e* e' i9 c9 C& m$ c% ]- type
$ `# y3 g& j1 r: K - ERole = TOleEnum;, M: m6 i, P" Q; A+ {3 E
- const
( d( n: {- j4 j# r6 [ - eConsole = $00000000;+ p- ?8 O5 D# }
- eMultimedia = $00000001;1 ^5 e+ Z* R" x, @8 W! G
- eCommunications = $00000002;9 F# ^7 t: Q& b7 j% p* T
- ERole_enum_count = $00000003;
1 [. U+ d' `1 r- R6 b+ A3 c - - F7 _, u7 V4 T7 w
- type( e+ G9 a: U; u( [
- IAudioEndpointVolumeCallback = interface(IUnknown)! j7 @ Z/ o5 ?7 m, i! f9 D3 }
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}'], D6 r7 Y& X9 L# E9 Y0 d! l
- end;* e7 g! P! h ?7 H, X1 H, ]
- W1 H( W, G" e% Q) _
- IMMAudioEndpointVolume = interface(IUnknown)1 V8 ^1 T0 B, i+ u5 N+ k. C$ A
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
' l2 O( O% I# e - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
: i3 e' h8 ?# D2 U2 w7 w0 Q# G - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;: R: R' I o# i1 J0 T# H) e
- Function GetChannelCount(out PInteger): Integer; stdcall;
$ w6 p2 g* {; N" F - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
% x# t8 F+ v# S7 N# y2 f - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
3 ^0 C0 L$ U; O( ?4 {7 Z3 ~9 A - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;- M6 v4 b" D7 g( Y. W1 e
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;4 D$ {# O1 p+ S6 C: `$ w6 e
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;4 i- t L& H5 Q
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall; u* J9 H. y4 t c9 g' J( B6 ^
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;( n, C8 f a% ]
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
' m8 `' o h/ B8 X( Q - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;$ @; h8 j. p9 ^3 g H7 g5 ?
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;% W( T; J8 L1 M$ @( k% Y9 x* d& W+ g
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
2 k6 T* p2 M0 {9 _) a - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
. [5 v. }' _. a - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;" B/ F7 L" X. [; ]
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
# j* k/ v, G( b7 x3 i3 M - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
& q" }( b4 i0 F. N- e4 G - end;
# v) o' i# L% N0 W
! K! \/ [) S( `( l# }/ h- { IAudioMeterInformation = interface(IUnknown)- | P( G$ j, D
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']* a' v0 G1 c3 y- ?& j; K1 ~# Y' W
- end;}/ u4 {5 ?4 u; ? Q6 X0 g! R
% @8 l' M( I. R8 C" ~- IPropertyStore = interface(IUnknown)4 ~7 m; n, Y: Z! M/ g
- end;2 G" P5 D' U* B/ v) [$ p; i& W
- 8 z; N: m6 a- [0 W! [1 N
- type+ ] i2 l+ X! @7 _
- IMMDevice = interface(IUnknown) g B: M* s. I
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
3 u; w( S! x: T+ |$ N3 F - Function Activate( refId :TGUID;* u' ?1 O) ^$ @, P; b) y$ P
- dwClsCtx: DWORD;
0 c( g' R. S7 t2 p" l - pActivationParams: PInteger ;
; ?$ M6 S* z+ X* F( G9 s: ~ - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;7 [: _% [8 K9 Y f9 @- q: ]
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;1 ?8 G4 z% J: N9 B/ p% j
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
6 U" m1 W* u9 Q) W - Function GetState(out State :Integer): Hresult; stdcall;3 a5 R2 v! N4 I
- 1 a8 Y: l' g: ~
- end;" C% f4 V) V6 b+ g4 Q# z
: \. _' P4 A- }0 G& B, x. v
" S( l2 O( c" R8 [$ b: J. w ^- IMMDeviceCollection = interface(IUnknown)4 F, p8 U O+ t/ T
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']; C6 I1 R# Q7 L' I. z1 h+ D* Q
- end;9 r: S1 x' P& `6 T/ j5 g3 p
- % j3 | m9 u' s( v, }
- IMMNotificationClient = interface (IUnknown)* x$ o3 g* D/ Q0 p6 O
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']+ U" }( Y' p8 B% Z
- end;
5 M$ `8 r: E# U4 x. ]8 `. L* ~( q$ n - 5 G# h5 }3 n; @
- IMMDeviceEnumerator = interface(IUnknown)8 L9 {. }: v9 I z
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']% C U6 M5 L! z7 g) {2 C3 R
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
% G; h [" O, A6 Y - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;; b0 \* L W- m* F; g) O
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
- r0 |) g, N: q% X( k3 k - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
5 \, K" d# m8 e; x) V, i& t - end;- g) F1 X1 m Y( o
- 0 w" K& R5 |/ } g, ^5 r; l/ @. q
- implementation
- D; w* @: U3 _0 \' o# N3 u - end.
; @+ P9 f, n+ S( N8 s
. ?2 j$ d5 @: W. [/ T s- Thanks & Reagrds,
1 o# [) {* {4 E2 v0 _' ?& f1 u - Mukta ...
& I9 ?% o- F% z# e8 p4 q
复制代码
% n% @3 s. X# ?( K* i( h- it's work in Delphi 7
" L( z* {" q1 W - //////////////////////////* \6 s- ~ N' v
- ' z0 a! K* j" G" \: @0 H' H* ^
- unit MMDevApi;7 q2 |8 a7 S0 i. p& W( Z. C
' u, R0 @1 E* I- interface
: [ u" `9 X4 e0 s# F; n6 B# z - 4 C! D! ]* R- v$ r* x
- uses0 r5 H n+ y0 d8 S
- Windows, ActiveX, ComObj;- ? ~. |. W" G/ V% J
- 8 L. A" g# N/ M( d
- const
' H: N2 x' _+ H. g! ` - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
- d; A8 y- D7 P2 `9 M - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';0 _5 `5 L, h7 E) X, ~. h1 }
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';$ l5 Z) E1 m3 j4 E; V
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';) ?0 B' T) y8 h2 `0 y- ~* |
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';# Z1 h' r$ |, |4 c7 C9 o O9 _
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}'; p8 P" w1 G; F3 z9 T
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';# z8 M5 N8 l5 r) v. [! m
- 1 D7 ?8 Q- L T/ l" j r3 l; N
- DEVICE_STATE_ACTIVE = $00000001;; @1 G) C7 H {9 X
- DEVICE_STATE_UNPLUGGED = $00000002;
: | i% O3 o7 B - DEVICE_STATE_NOTPRESENT = $00000004;
4 v# E$ C/ w# F! Q - DEVICE_STATEMASK_ALL = $00000007;
( |4 {, j7 A6 [( O0 l3 [7 K - 3 H$ V' s0 Y5 T' Y* G
- type' @) D" z. R6 ] |
- EDataFlow = TOleEnum;
! G& K" u( ?6 l. B/ E8 I - 8 {2 S; P, @4 q9 Y2 p
- const
& x% R. h+ x t$ E; |, P9 @% N, d - eRender = $00000000;6 F7 q6 L0 h! t6 ?; b1 S) a$ z1 _+ Q/ \
- eCapture = $00000001;. h) e- B; M, F3 Q4 v) H8 d
- eAll = $00000002;# w' r2 u$ L1 k1 d+ ?$ F" n8 M" r
- EDataFlow_enum_count = $00000003;6 Y( C3 h4 w/ `' w$ x I
- ( _5 W) O/ i5 ?8 h: `4 `5 m" v
- type
% ?- ~& w: m3 i; z+ {0 _0 k; V - ERole = TOleEnum;4 ]1 [. u0 N- N8 e# p5 @8 m
# K" t: R) ^2 H& O* K- const
7 g1 D) `( R- \$ P8 l' l/ v% q - eConsole = $00000000;
* {7 k- O+ p3 Z1 z - eMultimedia = $00000001;/ \2 n; z, V: f6 M" c
- eCommunications = $00000002;) D y! q$ p `0 A$ T
- ERole_enum_count = $00000003;
9 Y) [; v4 E, O* m5 n$ t - ; m0 h p6 T7 c f8 I8 ^0 V
- type
3 {1 W% T2 H, B2 R! x$ x - IAudioEndpointVolumeCallback = interface(IUnknown)
4 y6 Y. _' ^) p" X$ _ - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']6 I k9 X0 \ w* F- I! O1 M+ T' ^
- end;8 Q) C% ^' a2 G7 j I3 s
3 z! V$ `7 m# _0 P' U) _- IAudioEndpointVolume = interface(IUnknown)
$ Z+ t8 a; ~+ m% I - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
% }! ~) C! A/ S# Q3 u2 X! ~4 v - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
+ Q1 e. _9 V4 j1 Z - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;" I* [, W1 H5 |7 A
- function GetChannelCount(out PInteger): Integer; stdcall;# H. B+ M: _" q' ^5 `" R5 D
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;) Q8 x, d2 H6 _( R* D
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
& d# a1 V) H9 z* d/ o - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;4 M m8 W: e: r
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;( K! c* a1 g; d" Y
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;" k9 ?% w) e0 i4 ~+ x
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
# ]$ h, c: [- }8 _ - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;) I, W# o# P5 L3 Q: G- ~. G+ @
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;$ D( `, V) W# v
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
8 O: [: r, P1 _' S$ O% M. d - function GetMute(out bMute: Boolean): Integer; stdcall;( X7 m% x! n3 h
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
5 g! W/ G' |, ?1 d6 e! J7 ^+ J - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
- V1 X8 `7 u8 r L- m h - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;7 G6 h) r3 g! [: V7 M
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
9 |0 u5 M4 T$ c7 X - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
5 i! `3 S+ T" a: j6 [ - end;
C. A; ?# q% R( @" T0 q; M R/ }
B- E2 {% |0 z5 H. t/ F1 l9 d- IAudioMeterInformation = interface(IUnknown)+ b& ^/ S5 B" o+ [
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
9 K' K% W: O" B4 |5 u1 t; ]' w9 l - end;% j, _- r2 Y1 H! j4 g
- / Z- b% f! a/ e& Y+ q, i7 ~9 J
- IPropertyStore = interface(IUnknown)
" s% E# U) x* O% j2 p - end;
( H, Z! G$ m% L) E
4 r0 }6 o! L+ d; |7 v9 Y3 |- IMMDevice = interface(IUnknown)& g% c9 Q& {% P- ~! F$ r, R# ^
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
! G( i j0 [& v( z) }( S - function Activate(const refId: TGUID;
; U- s% u: k1 U) ~ - dwClsCtx: DWORD;
" A+ Y2 f: k# \ U - pActivationParams: PInteger;! D9 ^, w: V+ v% k* b
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
9 }- {3 F+ S9 o/ c9 y5 s - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;+ j+ N) N& [6 M" z0 ^6 q, Q
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;, ~0 |! d6 H- q1 j
- function GetState(out State: Integer): Hresult; stdcall;
! j4 [) o* A( B5 C0 q+ k' y5 K - end;
/ F& B( ]$ Y( o1 ]0 c, \% y( ` - : @5 W+ i5 m: Y8 I- N0 i$ G) W: y7 |
- 7 O- I$ c! G) C# K6 x
- IMMDeviceCollection = interface(IUnknown)
: p% r3 \* v$ \ - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']7 t/ X5 D! D- j: I7 w5 X1 f0 b
- end;7 M1 M& E* J- U9 @
; h w, Y+ P9 g" h, t6 r; `- IMMNotificationClient = interface(IUnknown)4 H) L5 T0 [9 i3 o! A+ d
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']. t1 f; I% Q7 K% v1 Q& y
- end; ], Q! ^, ?( ~+ R
- v+ a0 A d2 \( y W: o
- IMMDeviceEnumerator = interface(IUnknown) j- O4 j& i% r- p9 X) X+ ~: O
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
* W& t9 X/ p, Q. T0 X( v$ F+ O - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;, }' o; [6 W/ S+ i% V
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;! U- w% O" j$ n# j1 @" x3 l
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
, m0 s9 b2 [6 k0 L! ~: Q. p - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
2 k5 w% }1 x2 n+ q0 m) m3 z3 ^ - end;
* \/ V/ L) z0 `5 j - ' u! }$ O- W- ]3 j3 H7 p v) X
- implementation
" d. H: Y! N( L' Z
1 T# W9 z. a# e, n2 M C4 Z- end.. P' N$ A" Y1 |
- 2 ~' w4 l0 g4 \, Z* h
- ///////////////////////
) x3 w% Y h; Z - simple sample :)
/ n1 U* x) f: @1 X - ///////////////////////' R+ y% k- Z) B( y3 \1 Q \ @
2 V8 F# U7 M7 V2 P% z6 j4 |" h% C- //...... other code
+ v+ |0 k% y6 g' b" A+ c7 n
. f+ e ^7 [& `0 }5 P- uses ... ActiveX, MMDevApi, ...;- |* }3 u& t- `; E
- ' ]3 p# S9 T Z
- //...... other code( g! R* F- K4 b1 [
2 @- r8 c& c5 c8 ?. ^& U6 y- var9 t9 j4 p, f& F5 k6 [
- endpointVolume: IAudioEndpointVolume = nil;
( U1 H# V8 s. B* ?
9 Y3 l0 Z; Z" a0 ?" t- procedure TForm1.FormCreate(Sender: TObject);
" J! a) |! u6 {" t: ? - var
3 V/ \1 ?4 s. b9 U/ H; [( q - deviceEnumerator: IMMDeviceEnumerator;
: `4 E7 X8 b" a0 }" _- k - defaultDevice: IMMDevice;" A r. h5 l* n T
- begin1 S, O! v/ @$ i' K3 B
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
/ R0 K. e5 o- G, k0 s9 y - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);2 L6 L# x! v5 ~/ b2 Q
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);5 _0 T2 t( X. E# m* O% G8 ]+ E
- end;0 l: B. u8 t! a$ \* N' r" I
- / A3 Q- F, `* n' i. `5 t/ X
- procedure TForm1.Button1Click(Sender: TObject);
, Y4 ~# |; ?7 @/ y9 P) p) r& v - var- e: `& a* B$ x7 h5 o x2 h
- VolumeLevel: Single;- o9 k: T w' n# W* g( t; m
- begin
: R. l- F1 x( t: l* p. X - if endpointVolume = nil then Exit;6 u, @% I, k1 K3 ]
- VolumeLevel := 0.50;
6 X9 C2 L+ A% g. a s* C - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
1 |* c `2 e7 t6 I/ ] - Caption := Format('%1.8f', [VolumeLevel])
\. ~ V% i4 w3 K/ f$ @; N& _ - end;
) h" y; e/ b' [1 g6 I; W3 R - 1 @! `8 P- k( e. d$ G
- /////////////////////////////////////- v4 D# U. F. B1 a$ K
9 }' v H. J r( L* F- // with best regards ToxicDream
n6 @$ h3 T1 v7 Y: j! a
复制代码 |
|