|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058' `3 K- C7 Q* D `' x
By Mukta & ToxicDream- 4 t8 n4 H& O( ]; x% C6 G
- //for delphi 5
5 Z' q& w, b4 a7 k - unit MMDevApi_tlb;
. M* ]+ @6 t- @) ^/ ?( _# C# J, Q - 7 C m0 f; h, O; h& W
- interface& F j+ C }7 h7 a$ k9 h
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;7 B/ e9 W" ?1 u9 ], V
- const* x5 b. J- F" t' F. h; B* N5 x
- // TypeLibrary Major and minor versions
/ \: C2 v& G. K% n# R$ h7 ?% k1 }+ A - ' G2 G2 Y2 v8 m9 x, D2 K/ A+ {# t
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
- m; ?& C d' d1 ]2 c7 k - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
0 w4 \" H* b2 [2 e - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
- @! b& T& W5 t: q2 [1 K - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';2 u. m) L- v# R( j8 O/ H8 d
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
) S0 ]$ {& }5 X9 v' i* { - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
* F5 e: Y0 A5 d( j' s/ u - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';; n" Q; m: w9 U
- ( c8 h& a9 H; c
- DEVICE_STATE_ACTIVE = $00000001;
$ n3 D! T8 ^' B2 a - DEVICE_STATE_UNPLUGGED = $00000002;" u/ r7 S2 }# x) x+ C; Z9 ^
- DEVICE_STATE_NOTPRESENT = $00000004;
K; c# n5 `. C- b5 P - DEVICE_STATEMASK_ALL = $00000007;/ l. S7 Q6 Z) [# I3 e! t
8 W9 W- Y( w/ A1 M- type
# k$ U; x/ ?( |. i. j - EDataFlow = TOleEnum;
1 q: j3 N( w5 Q a4 x3 R - const% B9 C4 y4 S) E _
- eRender = $00000000;0 U+ d) j3 ?2 b
- eCapture = $00000001;
/ e8 s+ |2 M. }# j) ] - eAll = $00000002;
# Q2 {& }2 H1 o: j4 g/ k - EDataFlow_enum_count = $00000003;3 s3 y/ C* C$ X, ]
- , ]" o9 }7 ^% {$ M
- type$ s6 o: l. R4 n' M4 w2 f
- ERole = TOleEnum;9 M' P! g0 z# J. B
- const
5 D; Y, R# `0 w" O4 q( I - eConsole = $00000000;
7 f, k+ n/ K1 `2 D4 @( {. D9 i - eMultimedia = $00000001;
& r5 L$ }3 B! f: e3 D7 x# k! b - eCommunications = $00000002;
, l' t4 Q) t3 E$ m( N - ERole_enum_count = $00000003;+ p( F: A7 }5 k2 f8 e/ N" b
6 \* F4 b( |& F- ?, d- V- type' A8 N2 Z1 @$ B* u3 x
- IAudioEndpointVolumeCallback = interface(IUnknown)8 x0 `$ h! D, E7 ^ U* T/ _- @
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
0 Y# t8 y9 n; l: \ - end;0 z7 }# j% p$ W2 R. P
0 y+ M. e2 b9 z- W- IMMAudioEndpointVolume = interface(IUnknown)7 y8 |( W5 b1 A! d$ X5 ^( Z
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
1 x* o! y; I6 J" c+ y4 n - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;2 ^' j' i _. p2 o# h
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
& p3 Z) [5 q8 |3 U0 N- I8 f - Function GetChannelCount(out PInteger): Integer; stdcall;% T9 d1 l. W; C- f- m$ H
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;; o1 G1 Z. V! m$ s3 L2 E
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
, F2 U. }& D- J - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
0 M5 H( g r8 ?+ Z$ Z - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
* @( w3 Z7 W, a+ v - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
) G" y9 A! @0 z! G - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;! t) F( T/ p0 }/ X" D
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
8 R; ^0 h% U5 A! i# E- i3 p; _ - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;& W+ m/ } h$ S6 J' o. J4 K' N( b# W
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
. e, ] N( Q/ v }1 O; K' z5 | - Function GetMute(out bMute: Boolean ) :Integer; stdcall;
+ c6 e$ W: f) s5 t- J - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
1 g4 x) F* |* W4 S3 R# U$ Y - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
7 J$ X5 R/ Z. N) _- q5 x - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
) v) E0 m. Y4 V2 ~8 v% L4 d! w - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
% o1 z! b z! s - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
2 k% w" J1 o. Z. y: G7 I - end;$ H) g3 `# G6 f0 C
4 y6 @1 ]) \; T; z' V: S- { IAudioMeterInformation = interface(IUnknown)
! d( K! B, {2 T+ D/ S$ ] {6 t; R - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']; r1 K5 U; }0 x5 f
- end;}% b" C. }; T6 d- A
' ]3 J1 o- Q7 b: Q4 Y! L d- IPropertyStore = interface(IUnknown)
$ u( x/ }% \. M, v - end;
7 n2 z, R o/ U9 B, m
7 C1 L9 ]# ]6 m& X5 G) {( k) `- type
4 Z3 P! {1 G$ B9 X, b0 |* K - IMMDevice = interface(IUnknown)
+ h& q h- |& o. T3 a* p - ['{D666063F-1587-4E43-81F1-B948E807363F}']0 W: Q& e& Z0 |! h
- Function Activate( refId :TGUID;
2 a/ C+ p2 I$ w+ Z6 `) [# y9 V7 f! k - dwClsCtx: DWORD;
' y- d9 _5 c. H' @6 w( { - pActivationParams: PInteger ;
3 V4 W$ |9 a* g7 b7 @; E: ] - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;1 P! b1 d# S t+ k* [. {' _& ~
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
5 a5 c" @+ N c) a X" b - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
& l, P' n; r% g - Function GetState(out State :Integer): Hresult; stdcall;
+ x- c4 ^: k! }# m/ }$ O
7 f8 t$ U$ j( e/ F- end;. `8 n' C$ R: n7 T& P5 G
- ' d0 w# s5 b0 Q) l
, R9 ?& m) G4 K" _, H) J- IMMDeviceCollection = interface(IUnknown)1 L# l* |+ T3 [' L* s
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']7 o! n7 s4 o2 _1 A- Y7 @
- end;
( }! C& W' O5 _0 j! S9 {3 ^, \) f - % C9 n( f+ z' ^' h
- IMMNotificationClient = interface (IUnknown)" y4 T+ W/ k O$ S; z- c1 m
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
4 Y3 G, s% k3 z5 I1 S - end;
0 L6 {. S; W3 l p/ k; K- [ - ; D |9 K4 b6 J3 Z8 a1 x" \6 g; h" ~
- IMMDeviceEnumerator = interface(IUnknown)3 H5 x( r' [2 U* Q
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']+ Z+ O; K! Q) w- U2 G" q% e
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;# U2 C9 @( e" h3 V- i
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
6 f& X& k% q4 L/ i" y2 f( j - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
/ }2 w& \/ T* N$ z2 a; ^ - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
3 L1 N! ~" r2 w$ f7 j - end;
) e! }* Q; _2 R& C - 0 j3 O( e( Y; u4 L( k! Q
- implementation, Q9 N4 l1 ^ k" V3 q0 q
- end.7 b" F4 J, d& N
8 n. l$ s: c8 U; E. L- Thanks & Reagrds,( @( Z u1 C$ K8 S- |
- Mukta ...
& l$ M; y5 j8 X) y
复制代码
_6 A) d; X% u- it's work in Delphi 7
2 h9 D6 N# a: H H2 F' b4 O - //////////////////////////
1 v. `2 @2 O0 {% Q1 h& `9 U7 P9 ~5 a
6 A2 |1 ^9 ~2 }( \- unit MMDevApi;
1 k& {1 `. R5 e' o o" c: E2 N( t - + x }# [# `2 f
- interface9 i1 O: g" k6 c
! _0 {! a3 R5 N, |$ R% N! B8 u- uses
; w6 O. c! h/ f8 X- D2 B/ n - Windows, ActiveX, ComObj;! ~6 |& U7 B. j, Q7 ~
- / B0 Z/ k5 k( e4 g5 K
- const+ j* J7 ?, }) T( R& ?* B+ s
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';/ S" r& p( d3 g/ o
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';7 C8 t$ R# _/ @: i* O$ w& f: M3 B
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
: m! Z5 s; s7 m @5 L) C2 k( X - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
0 {& G3 D" N. o' k - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';" v- d' X7 `" n; x( N
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
5 \, p4 m! ~ Y' E! o2 M" I1 U# F - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';+ F3 K2 L1 N" Q2 [
- 4 Y s4 A! b6 f i
- DEVICE_STATE_ACTIVE = $00000001;! t$ u# s3 g/ D: E
- DEVICE_STATE_UNPLUGGED = $00000002;
6 `9 d( G" L, U% b$ ?7 S1 R - DEVICE_STATE_NOTPRESENT = $00000004;# t4 I4 u& m R
- DEVICE_STATEMASK_ALL = $00000007;8 V9 J) E( }5 J3 H h- R+ Q: o$ r
3 l" Z. P; L7 J& G$ i; E- type7 D. j. T6 |( k. H4 o! H
- EDataFlow = TOleEnum;; C/ p V: h8 ~" v& g: I
4 J9 J$ e3 P9 z- const1 O+ V6 s9 a4 x& T9 p) f6 _
- eRender = $00000000;! o0 n) m& T& ]9 r
- eCapture = $00000001;, ^) D3 \, g: e/ u, Z8 |5 y% v
- eAll = $00000002;
9 f$ N4 w& V4 d1 o, P - EDataFlow_enum_count = $00000003;3 {3 I5 C& y9 [( E+ u) q
( r" F! E* i N% z3 E1 i$ `( `- type
- y, o# K, |9 H$ c& P% h - ERole = TOleEnum;! k' t0 w& A8 M0 v* E
0 ~/ Z8 i+ \- o" w& m) `3 S0 I6 @- const* A$ l5 |* _9 M {
- eConsole = $00000000;
" N; i! R# @4 }- X6 T0 q# H - eMultimedia = $00000001;
- ?# j; T3 f+ x" L4 P* N$ Z - eCommunications = $00000002; @& t: l: V) M
- ERole_enum_count = $00000003;( L5 {5 i" t% j( M
- L4 V. b4 y" C0 p* a
- type/ n& r. Y/ D3 j( O$ t* c3 H* v2 ?2 {1 q
- IAudioEndpointVolumeCallback = interface(IUnknown)
: J& z5 X6 M! r - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
* }+ A( c. a' a$ z, [ - end;
5 u3 ?# r% |0 i# N1 Z; Y! x& i
. f6 a! Z5 t1 u7 o# `- IAudioEndpointVolume = interface(IUnknown)
1 V# W5 m# T, w9 x1 M2 ` - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']/ C' ~9 j8 H7 U
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
4 F3 r5 P- t- B$ n - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
4 J; b6 U" k2 b' c; N - function GetChannelCount(out PInteger): Integer; stdcall;
% L# p9 v$ v/ r& C1 U) z( u - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;; I# Z# j# E6 ], T8 e d
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;( s: }3 [- B; N
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;1 W& \' L% j# F: W4 d) w
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;* w; z0 t$ R7 x( K# I8 ~7 A
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;, X3 {0 U: y0 ?0 Y( C4 C
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;* ?$ ~ r% g9 j7 R/ q) R
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;" j" R; _4 X2 { ]) h: _ Q
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;; a" k8 u. g" A! X* G
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
8 |6 O; a+ P- K ^1 S h/ u - function GetMute(out bMute: Boolean): Integer; stdcall;
! ^- [, b8 V/ Q - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;, Y! q* @$ p( f# ?( N+ H
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
9 m$ g& i$ a. O& K - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
2 w- J0 z# l' a4 j' L* A! \. s% ~ - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
2 ?9 X! F% \5 ?' l% y3 _6 E+ D - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
1 v7 ~2 r5 h6 H5 y* V - end;6 W3 {% L/ Y \" I5 p
- , S+ b( u/ _( R" l6 |
- IAudioMeterInformation = interface(IUnknown)
( c4 X; j" b. C. g4 D - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}'], h* }, j/ S$ H: h" v7 p, P
- end;) Y) y2 s8 |1 G; H6 a5 z
- Y. F# d: }3 O. Y& P# p. X. f5 A- IPropertyStore = interface(IUnknown)
* j' Z- Q% u5 Z* j$ Y% j - end;5 i6 @$ q8 L5 X1 t
; S, _/ o% s6 y# ^; U# I4 c- IMMDevice = interface(IUnknown)1 G+ y' c' k( {/ ?9 I7 H* V4 ~# A* x
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
7 w4 y8 w) H" w. Y - function Activate(const refId: TGUID;
, g+ g3 j# Z. { l3 R6 ] - dwClsCtx: DWORD;
( T8 J& W1 J# _ - pActivationParams: PInteger;
' a, `# @5 s. Z( b% o0 R5 F - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
! X- v1 y' k) k: b( {4 d" P. T - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
/ I' b0 ]& I e3 e - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
- c8 p: j' F3 z0 ]6 S - function GetState(out State: Integer): Hresult; stdcall;+ p+ M6 X; `8 L/ C
- end;
: j q' i1 e5 d4 u8 |5 B; q
* V5 F* H, z0 m- ?6 }) i4 w
( w- x# ]3 e4 h+ e( @/ E! b- IMMDeviceCollection = interface(IUnknown)& F( u# t" M$ ?
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']3 Y. I- N- e2 k6 ~; g- @
- end;
{7 Y7 U0 i6 i6 ]+ t& [" s - % g5 A8 s8 f! ?0 ]) A
- IMMNotificationClient = interface(IUnknown)5 W/ k c2 ?& h" T% I1 v; I$ U/ A& C
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']1 @2 w' m3 D* \- b! J
- end;
' e3 ?, W* n- w* y2 P6 d - , |$ H( U8 ]# l; c. J* e/ k
- IMMDeviceEnumerator = interface(IUnknown)* I( H7 H3 _$ v0 I* b( Z# G
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
7 h& U0 f) l- i& ^ - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
, f5 D0 A* c- K R$ ?! q# N - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
+ Q# O+ R0 C5 }) ~4 u' ^ - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;& ?/ Q" \* P: \* @6 ]5 w
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall; J! @, R/ u; L4 k2 F. {9 r. _
- end;
2 j E f8 P9 P9 D" m - 2 D: c, a5 s* S0 I' P
- implementation
2 f+ J" Q& ^; R8 K& U - % u2 y, l* y% `( n' i. u
- end.7 o: |: Q' g0 l' i( [- L
- # T8 q: g; `: D
- ///////////////////////9 \$ v+ J# R4 | o( e
- simple sample :)
0 O6 i+ o9 ^* e; W9 u9 q% N - ///////////////////////' H1 R' J2 w, I" l3 K, t
- " \# e4 c% Y4 }9 J0 p
- //...... other code$ w: o8 w8 p! Z2 n+ A
7 ]7 g* f) v+ w7 \. ?* o' g- uses ... ActiveX, MMDevApi, ...;
# Z8 X- v- l) S7 X - ( P. \7 ]& @6 P, c' T* _' e
- //...... other code; K3 K) M k; v' P8 Y
0 }( g! C/ v$ ^# S2 \- var# j0 u* L% f8 r, g ~! M+ b
- endpointVolume: IAudioEndpointVolume = nil;" a! p6 E! x4 _# D
7 G7 z5 r9 M5 o0 F {+ @" M/ D- procedure TForm1.FormCreate(Sender: TObject);' B, [" l( f( J5 O) a
- var
) c( ?* v! D7 p7 }' Q- l - deviceEnumerator: IMMDeviceEnumerator;
O# t9 Z8 h& E4 |8 N - defaultDevice: IMMDevice;
/ k! f. `& v6 I' T) o, C) e - begin# d+ X& ]. _2 e9 N' J
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator); U8 I. d Y7 K3 {
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
% Q" A$ U- Z/ t2 e - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
) U! ~" M1 C' S) F: v% h* m& v6 g - end;
8 O u- _, J% O$ `4 L - R0 Z6 P0 k9 S. r/ [
- procedure TForm1.Button1Click(Sender: TObject);2 o2 @8 r, Z$ b( I4 L/ n
- var8 T6 C; t9 U9 @: z( {. T& ]
- VolumeLevel: Single;
. n4 Z1 o7 Q, [6 g - begin8 k" t' |& ?( t ]$ v* {$ R; I8 E
- if endpointVolume = nil then Exit;. c2 o) o( Q! Y2 I1 { g: E7 X7 w
- VolumeLevel := 0.50;
2 d! W+ b4 M. x' |4 R+ w - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);- X7 T' a" { _ b
- Caption := Format('%1.8f', [VolumeLevel])
) B6 x) d) q3 m7 e: e5 c k) v: ] - end;
/ @! w* R) G8 c$ F- N
7 V, G0 s; m. i& z- /////////////////////////////////////; m* f& G( N! T
7 Q( `) O' X/ U& z$ |- // with best regards ToxicDream
4 x& Q- w' k2 |0 d
复制代码 |
|