|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
, y. H( w) O+ a& H0 |1 w5 c5 o: `By Mukta & ToxicDream
, e1 J5 q" h: v- //for delphi 5
7 r+ n' R7 }' w* l; h - unit MMDevApi_tlb;) N8 h9 F7 i: v9 E7 l3 Q, N* a. T
- 5 N# L% H; o- X! V" Y! v
- interface4 e: G4 i9 m* ?* F
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
; l6 T; e# ~. P - const# k+ y% {% g1 ]0 O* R5 _
- // TypeLibrary Major and minor versions% t0 k- q; L- u/ P5 @; b- C* P: d3 k
, W2 J, W3 O9 B- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
4 k- ]5 r$ v$ i( ? - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
1 `" x2 Z; [" t- V - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
4 d3 e, U7 Y/ T- J9 \' G9 }, s7 s - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
" T3 J+ E, |/ O! ` - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
" z* u* R/ a8 t" E' i - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';( s* G* P8 h) e+ ?! Q
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
8 R/ d2 p' M# |% D- }! d! w7 T
5 k5 V' d$ |/ V8 Q" d- DEVICE_STATE_ACTIVE = $00000001;: E6 R) O* D. {' o
- DEVICE_STATE_UNPLUGGED = $00000002;
8 c. Y# a. e6 Z5 ~ - DEVICE_STATE_NOTPRESENT = $00000004;
, i0 H* G7 k# B - DEVICE_STATEMASK_ALL = $00000007;" [$ V3 X! A% F1 {! B* W7 ^1 c
; {; _2 ^3 X8 Z( @* W& P- W- type' N* ~( A+ q% g( `( L
- EDataFlow = TOleEnum; l5 j) s2 F. R! p7 J7 F0 U1 y
- const! s0 N- Q; s5 t( l0 v! ]3 y& t; R
- eRender = $00000000;1 x: u( X6 H' e% I, U" `; m
- eCapture = $00000001;
# A% F! N! A c0 B) c$ J1 V: M1 p - eAll = $00000002;2 ]1 z" c0 y* I5 e4 D% Z! H0 t
- EDataFlow_enum_count = $00000003;* a/ t. j+ g: u- `9 Y; g" V0 A
- ; t% @1 m2 ? K' h) a1 D0 _; u
- type% C4 Z* n* Y2 L' s2 f7 Z0 M! w
- ERole = TOleEnum;
. l2 ~: g- g: C( q. h - const
2 d$ Q6 j8 y- W2 P0 k4 a# } - eConsole = $00000000;
/ F- U& F, j! h/ r - eMultimedia = $00000001;
2 P* N8 d, T' p7 N - eCommunications = $00000002;: O+ T+ ^) l' R: C7 Y% p
- ERole_enum_count = $00000003;
3 ]! j. Q. z: O7 m# q2 _. i* s" ?
. \/ o- h2 J. |- type* R% {9 m. l0 H7 I8 e; x( ]/ ]7 @
- IAudioEndpointVolumeCallback = interface(IUnknown)4 ?- k1 m* }1 @6 n
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']. W; [ r" B& r" [ o ~! B
- end;
2 c) A: U+ x9 s* }6 N2 c0 y) |
. Z0 {+ U- k; I. z& i- IMMAudioEndpointVolume = interface(IUnknown)2 X# Y( q7 ]! _: b3 i3 L1 N7 G6 d
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']! i1 G9 p" h" R' ]: W
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;3 T6 [, V2 T$ _( S- p. s
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
; a4 q, _. m- n - Function GetChannelCount(out PInteger): Integer; stdcall;# a2 \0 s. [! T" O$ K1 c3 E
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
8 h# K( N9 l E& i" _ - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;. [3 |4 s0 ` ?# Z
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;" ~8 o& k% z) x0 o: G$ Z
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;; G% h M+ D/ T9 u
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;6 _! C/ F, q# E/ z7 r% S, H) e
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;6 j( x3 [ b9 V% R* g
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
( _: f& t! h* } - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
' \# u: I, z8 R* C2 F$ T1 ~- H - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
' C4 w- P" ]. ~! T. A - Function GetMute(out bMute: Boolean ) :Integer; stdcall;" G: T8 m4 }! H# q
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
" i. }! {& V" h5 D" z) m/ z - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;/ Y( f( r0 n" v. T( x
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;8 ]; i- \ g2 C. X4 O# k u
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;& s& D, D, F3 x6 `- Q
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;- }- s, I2 }( X1 l/ o u/ r: c4 [+ Z
- end;
+ S0 |1 X- S* a3 Z - : U* }4 j! T( S% M& G
- { IAudioMeterInformation = interface(IUnknown)
7 S/ t: F. D7 X2 h - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']" @4 z' ?: B0 N9 n" s
- end;}
& o+ o1 M9 v" E& Y" j - - N. ~% a2 t: a3 @$ X: b3 L* D
- IPropertyStore = interface(IUnknown)
6 e( E3 d' T* h# }8 s7 r, ]0 d - end;
, V# z9 O' y. v# `& `" D9 Z - ; p* j. m% s# Q t9 Z
- type% G6 o4 Y) T/ R/ N: \
- IMMDevice = interface(IUnknown): X: T9 E4 o3 k) b. s c
- ['{D666063F-1587-4E43-81F1-B948E807363F}']' e2 t0 Y, j% G. y
- Function Activate( refId :TGUID;7 u/ A0 Z3 t; O v/ b: q
- dwClsCtx: DWORD;
9 @8 w) P; h0 \9 _" F - pActivationParams: PInteger ; q/ a) d% t& Y8 ]! W7 g" f
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;& f4 p) U2 S# ]
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;* i8 U: W7 u$ g8 e
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;( c; Y* V+ S& |
- Function GetState(out State :Integer): Hresult; stdcall;6 S4 ~1 b; J. Y( t
- * X% v, \5 Z/ O$ S1 z
- end;- e- l: [3 v; z# E
0 l D$ o5 [# f G* Q) _8 \/ p
1 r" s: n' s5 a/ g4 V% }# [# A- IMMDeviceCollection = interface(IUnknown)4 Y3 _6 B; }# D: a' ^% K
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
5 r, X+ ^: j8 c1 s. F) |6 s - end;
4 O9 v) o! `1 R! B. E4 H( w$ r
4 F& b% @2 Y7 ?9 y- IMMNotificationClient = interface (IUnknown)$ N' Y8 P4 a/ z3 W# i H" K
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']/ H4 Q; b' D, M) r* j
- end;( }6 n1 M, b' J5 U0 Z
- i* _5 m" F+ y3 G1 |! {- IMMDeviceEnumerator = interface(IUnknown)) Y0 J, F$ |( z2 s6 Y
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
, w$ e' F0 Z% e6 h/ y - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;) [- j. s* g# Y2 w2 p2 U( |" t
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;5 W% T) p6 b2 d- G `' v S
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;$ L# ?# p1 q! L; c; D
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;7 ^ E# [4 C3 H& {4 }, E6 \: @
- end;5 Y9 q' r: g Z' `: \
# y: s9 n9 ?6 r( Q3 k- implementation
! Z1 a& s# }: d8 u* e8 }) p - end.& }2 I4 m. ]! T" L' E
- . v8 q1 |" y! r# F
- Thanks & Reagrds,8 i* V+ ]+ b' f$ ?; c
- Mukta ...
' h4 n/ V; v ]% q g0 q
复制代码- # }, t3 t* q4 i, V3 Z
- it's work in Delphi 7) X# R: h ^' N; u, A* u' p0 L# [
- //////////////////////////
. e- x) W" a) }
/ Z2 i2 T8 ?8 g i9 a2 W1 m- unit MMDevApi;
% `8 q% b; s7 T+ w O5 Z - $ I6 O" S" u5 p8 w
- interface
9 C* |' P2 R: `' y }* x* Y - % p0 u: a- @; K8 _- { ?
- uses
6 T, O0 c& A M& j - Windows, ActiveX, ComObj;
* \) G* K6 {& b" U
/ m$ K A- {. e0 T" W; b! r" B% a, P- const
, X3 \, K5 ?( D6 A7 s. t- T - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
; k1 q2 Z* j, p# u. q; F+ N) M" \ - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
7 j* s& m) n3 [ \ R( m - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
! F) H+ k( Z4 @! F2 J+ S$ k# I - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
9 ? J% Q7 q( x. m; v: W# M3 I - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';4 @& d4 j+ O3 B4 ~: T
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
5 N9 D+ s, ]0 \: f# t: z - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';7 H0 z7 `, l* y1 V; a5 G3 B
- ' |7 y7 S5 f+ A$ n
- DEVICE_STATE_ACTIVE = $00000001;( f2 t0 P0 C' c- ?4 E+ Q
- DEVICE_STATE_UNPLUGGED = $00000002;0 V- N! ~+ m% J. \
- DEVICE_STATE_NOTPRESENT = $00000004;
( S% v* q L) O( ~/ A6 t - DEVICE_STATEMASK_ALL = $00000007;
7 z2 m4 V" J# E1 j* |1 j5 u - 0 W7 S; p6 Y8 _. W
- type' }% o' L; Y' [, j6 ~8 G d
- EDataFlow = TOleEnum;
' v/ X5 q5 e3 A' `5 ? - $ p; |; b4 g1 `8 b0 l7 ?
- const( g. C4 X1 z3 b7 X; ?& k
- eRender = $00000000;
. X* B/ G9 N( p6 l' }, |! \9 R - eCapture = $00000001;
% o1 M' X& a$ _7 V% n - eAll = $00000002;) \) I: x7 q6 z E
- EDataFlow_enum_count = $00000003;
1 M+ ~; j4 m8 {7 b
. j4 n: y+ X. n1 j9 }- type
! [' B1 i6 W% ^+ G$ S& }2 h6 p - ERole = TOleEnum;" H% V+ y- @0 X m4 R2 ?
- 8 q+ ]2 J1 L6 y6 j' t3 S
- const
: B+ l3 w! m; f& B$ ^ - eConsole = $00000000;: a5 D+ O' C; h9 R, B
- eMultimedia = $00000001;% z) Z# Z% [' x+ B2 x3 Y* ?% E1 N
- eCommunications = $00000002;5 f1 P @" X. z' l8 ~/ y+ a0 n! _
- ERole_enum_count = $00000003;4 w0 E( k7 e$ c+ A0 I6 x
( M+ A1 O9 p8 P( g' t- type
6 X/ p7 v# ^/ o7 }3 |: f - IAudioEndpointVolumeCallback = interface(IUnknown): M# G* i+ U4 @9 J V- X: X
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']4 |0 T3 q* M$ W$ x" v. y
- end;
$ k. v' Z$ d0 `
9 B! L8 O' T5 e9 M* [- IAudioEndpointVolume = interface(IUnknown). u/ L! n; K3 R3 _9 M
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']9 P% a0 g' |1 f9 Q1 G1 ?' E* m; ?
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;$ i4 q* K$ b# M4 Z0 t; O
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;4 A" A* h& e A% f3 D; v3 [
- function GetChannelCount(out PInteger): Integer; stdcall;4 c2 J, R& O% u; } d% P
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;$ a9 e0 X: Y. e( i0 ?8 b+ y8 a
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;4 Y+ A5 G, H y6 a R$ g
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
3 A7 g z6 u6 \& j - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
" Q: x: e% ^$ n4 R9 H; M9 k6 r - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;2 G3 ]) q) Y! q( y# [
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
, b! c6 _/ z6 L! d - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
* ? h8 q" |# k. r - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;' Z0 W& y+ q/ S( y6 F; c+ O6 b
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;. u, [0 A3 U! k( _
- function GetMute(out bMute: Boolean): Integer; stdcall;3 x2 }; G6 }& L& y5 E( C* } W
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;" f& t4 }- s, ?
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;+ Z4 e) s7 o, x
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
1 H8 X" ~, G: C2 ? - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
; T& X8 R5 A6 ]! J! i ~ - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
( y$ Y( h. T! _ - end;
# X! k- B+ O' q9 [: L# j0 H7 `- k - & u1 W1 F. {- x
- IAudioMeterInformation = interface(IUnknown)2 Y( M/ u7 {6 c
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
) Y' V/ s7 U1 c, v) G- G - end;! Q: J% ^8 |! M/ K: C
- 4 K: h5 G+ |+ {( \% p
- IPropertyStore = interface(IUnknown)
8 d! w' ?6 w* t7 {1 q D' B0 ?/ @ - end;; {' i+ s( N- V8 ]: v
- L8 k: z7 N6 A, M, J) X. q- IMMDevice = interface(IUnknown): C( t9 q4 }, c0 u W) y
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
* B/ Z5 W4 T/ y* M. K - function Activate(const refId: TGUID;! D! p7 {- D0 U9 ]3 S! f
- dwClsCtx: DWORD;
4 Z, o5 k) V. M* Z# j: { - pActivationParams: PInteger;
2 [" L+ @$ |- P - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
& ]: L; h" h# ~ - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;" l$ I. g/ y3 {3 A1 F5 m
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;, h0 K% T* i7 I+ |! y. j+ A
- function GetState(out State: Integer): Hresult; stdcall;% e/ ]+ _. u$ C5 x( ?: S
- end;
4 A; ^4 @* M% T. ^! j% h6 d - 5 a$ q" N: e( i0 v& Z# ~: j
( A; V, ]9 T9 r% u1 `) N: j: b- IMMDeviceCollection = interface(IUnknown); Y4 n; ^' k& @- @: H+ X' b9 W
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']! \" D" a* C, d3 z: |
- end;
' R+ v7 `) t, M) I# C- W! n6 q - 5 {) w6 q, b, d; U
- IMMNotificationClient = interface(IUnknown)6 f$ r2 |6 }5 v2 ^
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
& q, U& b1 k- X! |+ t - end;
& y, `8 Q/ r% s1 |; \* h" y' J
7 j- n5 W1 M6 H3 D: @. D- IMMDeviceEnumerator = interface(IUnknown)2 e/ @5 t6 G. {0 a
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
2 @9 ^1 j- O- r0 X - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;0 u' h4 [3 u7 x/ d
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;1 B. a0 @/ F9 x- @7 I
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;' p2 q- }1 e1 t, ], e, z
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
3 ~2 t5 _. H5 D - end;
4 n0 J7 R; O1 ?/ {! \
, d8 Z9 ?0 a1 s( I. @: R4 _- implementation
% f" m7 q. o0 q" F
$ G+ f; Y+ @8 s& X% p! o- end.
. I _; Q( o {& @0 k; u - 6 o7 k( N( X- _# x: R1 K& w9 A
- ///////////////////////
C- e3 ^9 B0 q; | - simple sample :)) Y# \2 G# B$ D( Y4 y# v
- ///////////////////////7 ^6 Q' ^% P' \: o J( F5 O0 l* F
- 0 c( \ B8 J2 ~
- //...... other code
$ k5 o1 f; T8 e8 F% R8 S( w! S% b - $ A' B% q! @ y X
- uses ... ActiveX, MMDevApi, ...;
7 m6 H! j* k4 J" s0 k6 B8 x, T - , Q4 p' U/ E3 t
- //...... other code% v3 n f) e8 ~: q
- 9 g6 b$ X2 |/ E
- var
* {; C0 s9 N; H- o X/ R - endpointVolume: IAudioEndpointVolume = nil;
! x" D' M+ _' f A0 \
v5 T: J+ d6 J y- procedure TForm1.FormCreate(Sender: TObject);
0 g8 l* y. F: L0 a6 t [ - var6 \$ G8 A' ?8 d0 b) F2 R% z
- deviceEnumerator: IMMDeviceEnumerator;, f0 \( Q6 G' d
- defaultDevice: IMMDevice;
5 V3 c P' G/ @3 C$ O; C( ` - begin0 ?8 s6 ]: x7 V& o- F" F
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
8 V* f ~3 i& }4 w5 P; u4 c - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
$ d2 x9 _" q2 q/ _' _' A+ W1 f% { - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);' v+ A! i3 B% R0 o% L2 [- t
- end;
5 v0 E6 d1 i) M8 |9 I1 w" K
' O3 {( Q- e. U6 `( E6 `- procedure TForm1.Button1Click(Sender: TObject);" G$ ^- d- j. I% [2 t" J+ a/ z# S
- var
5 E7 G, s6 U) O* t% M( Q: y - VolumeLevel: Single;) N7 n/ L# f; `" u; m
- begin) ~4 j' C2 u9 w& e: w
- if endpointVolume = nil then Exit;
0 J% @, I) A- M# a& s* z - VolumeLevel := 0.50;
7 G! E( e6 [& w/ T - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);1 ?5 i4 G; N1 B. z0 e5 ^) [
- Caption := Format('%1.8f', [VolumeLevel])) T3 K" b6 f" y
- end;/ u0 O0 g2 O/ S3 z' u; a
- * D! q# G( Z" ~6 l! A, }) R
- /////////////////////////////////////8 j& y& B) S# i1 S. m
- # u1 A( u* j0 F) I
- // with best regards ToxicDream( l# H) _) x p* a- V% N. Q% a( k
复制代码 |
|