|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058* \" j! X, W& ^- y' d( j4 W
By Mukta & ToxicDream- 7 u1 m# r& r" O1 z" y# o
- //for delphi 5
: M. J& L, Y, r- K - unit MMDevApi_tlb;
6 a) ~# D! E/ X: W4 r \
; O6 }; i' r) r0 X- interface3 ?1 [7 n4 H$ }+ ?
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;4 ]: e- M" X3 t( U8 D% g$ f6 L
- const
4 o. _+ m6 z6 ^# G - // TypeLibrary Major and minor versions
: z& c. g0 E/ G' A
) I% B/ W( r6 i' I: N& p- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
" D3 @. ~; Q+ ?# I2 w g3 x& m* H( x - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';- c* x) g8 r3 }. V! D
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';3 _# h7 v1 o+ ~# N
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';6 v& r2 B" ^% I; Y* W1 S
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';% b5 y6 X0 t% j$ w& L8 F4 w; z' v
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';7 m2 S2 P0 D( [' L5 h1 d0 A
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';& \$ N3 B5 ^9 y; J3 L/ w
; w( b2 Z8 c2 t8 _, c5 `8 k0 a. j1 ~- DEVICE_STATE_ACTIVE = $00000001;3 P V# q! ~4 Q
- DEVICE_STATE_UNPLUGGED = $00000002;
; C5 i$ M1 f: G T - DEVICE_STATE_NOTPRESENT = $00000004; A. e, a8 r9 O
- DEVICE_STATEMASK_ALL = $00000007;* m6 i" i/ C. Q! u# o
- 9 b$ d J) z* S% x X
- type6 [% T& h( k0 {( W, |% _: n
- EDataFlow = TOleEnum;9 C2 E$ R7 k. N* \. O/ {2 A
- const* h6 ~6 q( e2 H* F
- eRender = $00000000;( P& i' F% W+ l3 _* E
- eCapture = $00000001;
4 i% j' E) L8 Z+ \7 I4 d3 Z - eAll = $00000002;
. e. g' I5 Z2 K8 s% K - EDataFlow_enum_count = $00000003;% N8 M( Q8 A& z
9 ^( @& y- D! D. ^: m6 k- type
`) H, o* R: b( B0 x+ j2 ~ - ERole = TOleEnum;
4 s8 q" D, v4 k: F/ l. j - const# ]% W" z2 z0 b4 [/ |/ P& y |
- eConsole = $00000000;3 L% N' k- V, H! M) b0 v
- eMultimedia = $00000001;
/ u3 I' S9 N: x. [0 S) ]* a - eCommunications = $00000002;
7 F6 N/ n2 g8 y - ERole_enum_count = $00000003;
3 ~9 {1 e* K; u m' w/ l0 q; a' u/ T - , {; `2 O( ` W% k1 ~
- type( u# d4 o1 g2 d3 f. e
- IAudioEndpointVolumeCallback = interface(IUnknown), O! f( `8 r9 x! U# m% c7 s
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']9 h" g' I' L4 Q, b6 v+ b! n
- end;+ K* A2 I& T' v: I8 n" F+ `# S7 J8 Q
- / E$ i/ C' Z- a. L& e* i. Y
- IMMAudioEndpointVolume = interface(IUnknown)
" N. W z# O: W" N v V6 W# d - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']' Z( p) I8 l# H* w/ f
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;$ X1 a7 I* k$ @! d2 r
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
4 B, F1 T; s$ z$ R9 W5 k$ o - Function GetChannelCount(out PInteger): Integer; stdcall;
; E3 p- m+ e3 [5 H! e - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
$ q7 A* A( R3 |: f+ | - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
) P9 [+ E3 N; Z( J) s! H: r5 l - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
m7 e1 M/ f3 M - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
. g4 [6 J) e4 [8 Q* U& H8 i0 l. c - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
7 r" B5 R( `3 `7 Q$ d - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
9 R {# j2 v2 G - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
7 L' [- ^: ~6 h% ^) g - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
4 {; r1 L. d# D6 i; ~ - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
# d, C/ `% C. P2 N: q& H - Function GetMute(out bMute: Boolean ) :Integer; stdcall;0 O- `( _6 D4 V+ P5 l' ^
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
4 T$ C0 Y4 ^: G6 K0 q* O5 o4 K) I+ g - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;9 W2 n2 ^; v. D6 O8 W7 l
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;7 s9 x% X1 u6 n9 q4 c
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
4 g- u( [" Y" m8 G/ [; [# L - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
/ Y" ]6 K U% s; x - end;
+ M# [9 g$ f- c2 j* z9 J6 P; o - " F' c, l6 m- M- d4 v( C
- { IAudioMeterInformation = interface(IUnknown)) e6 \# p8 n4 J' ]' j: z
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
8 B2 I/ R N/ H/ l - end;}
# I! E* G# x% D0 B
( I7 Y, T- S$ a5 q" M- IPropertyStore = interface(IUnknown)& \5 \- W( e' \3 d2 w* G
- end;# T- c( W' S2 e# ?3 f
' G X, \; K Q+ P2 Q- type
, p8 ~7 v( z% b d5 P. ]& N9 g: n; ? - IMMDevice = interface(IUnknown)+ f* G( `! \2 r6 p; _
- ['{D666063F-1587-4E43-81F1-B948E807363F}']7 W1 W: @& }( u
- Function Activate( refId :TGUID;
+ ]% |( i+ R8 Q m: Y& w& C; n - dwClsCtx: DWORD;
6 b7 u5 f& K: ]# g$ Z3 E - pActivationParams: PInteger ;
- z% ]2 Z4 R" W2 e6 u: w0 N - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;$ T8 F) l x' @4 |, x
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;, c+ a3 B1 R7 {" e" O! B8 T1 V
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;: Z" m5 C2 j& I8 W
- Function GetState(out State :Integer): Hresult; stdcall;9 u. g( ^( B" \
! T. Q1 D# d# q" D/ b& J U+ e- end;
/ y* {1 P0 S! I9 [4 H
* f5 G7 P- E% S. v5 j
( }3 a8 M6 ^$ b1 A: P! i- IMMDeviceCollection = interface(IUnknown)
: g/ q/ S( k. ? - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
( n1 E3 j6 s, x( F6 g - end;' J# M4 p9 M' @/ d; M: p( Y
- $ L! Q+ ?2 m/ A7 f% {6 j
- IMMNotificationClient = interface (IUnknown)
3 ^/ A- q) [* H) {8 f* ~ - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
2 f1 R$ t1 E1 F& Y( G/ ]9 y) c - end;
! j. Q4 K+ G( e
) c1 x( f: X, \- IMMDeviceEnumerator = interface(IUnknown)
! A0 S" X1 r. ]% `! e - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
% O! ^2 G% ?/ r - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;1 O/ V7 K% a$ J4 w
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;0 }& f2 v+ l6 H8 }
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
) K: G; @7 z5 }; _) M9 C - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
: b8 R) { S1 G6 F. ~4 X$ Q - end;3 K7 w* H, O5 c3 `: G
- 2 ` N. ?' i3 n! k3 P
- implementation7 @7 s8 `' o, U
- end.% E) l% k" s) P
- ' I! B* F5 p' v" Q' p
- Thanks & Reagrds,
* m% L2 w4 D# f, s6 d4 `; e - Mukta ...& r( t& s9 A3 ^/ Q
复制代码- / p; Q, G; }% T7 W
- it's work in Delphi 7
9 i' D. {$ C5 x I9 ^ - //////////////////////////
0 R* b# A! T8 d5 F( `! {2 E4 F - 7 [! g/ T1 f, P: W2 U% b/ R
- unit MMDevApi;, P8 y! D+ ]/ V
0 w- g5 c, n% \ n- interface
& K# i2 [; W2 ^) }" p
& \0 y' ?1 Q" V% n+ P- uses
& D& b. F, O9 ^" E" p, p - Windows, ActiveX, ComObj;8 ?3 ~) Z6 w' a
# D" ?5 m5 O" z! v% C- const6 I( u$ _/ F, e* ~+ [6 B! i+ I
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
' P2 V' k' [: T! w, D3 ?2 e - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
2 j* _/ p6 G+ A; ~+ M; h - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
: Z. p5 h( X# L; s - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
9 d6 N5 _; C" Y6 |8 Q2 k - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';6 Y2 \* e7 i7 g/ u( V4 w
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
; S& Z r% r6 o3 |: e# ~ - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
2 O3 D0 T, f7 V3 G% r& d- y3 K: W8 [
+ k* b6 i3 R' p' W4 A) P' g- E! E- DEVICE_STATE_ACTIVE = $00000001;% H+ `7 x5 e. ?* {) @6 _' F! k/ k
- DEVICE_STATE_UNPLUGGED = $00000002;, w- O. A; }5 M5 I' Y& A# c" C
- DEVICE_STATE_NOTPRESENT = $00000004;
8 i8 h# r, u* c, Q - DEVICE_STATEMASK_ALL = $00000007;
$ m; w! d& o2 p+ O9 i - 9 y0 C$ }% _# v5 Q
- type- ` W& Y6 ~+ @ r
- EDataFlow = TOleEnum;
2 m# q) B* v3 B0 C
- n! y* V v+ q$ h' \; X) I' j- const
0 p* e6 \% m H0 } - eRender = $00000000;+ [) V& b- S) V4 @9 ^/ w
- eCapture = $00000001;! }1 x! D: J5 n4 [1 o
- eAll = $00000002;
0 O- H7 L$ M/ r6 K - EDataFlow_enum_count = $00000003;) y8 o3 B* ~0 ~- @$ L. _+ Y! h
3 `9 ?' B1 B3 g, b7 F/ o- Z$ i- }/ C- type
+ K1 {' u- k6 Y! H3 u( E - ERole = TOleEnum;
4 L! w( L3 g! e8 s% W+ |0 V - : p6 B, M7 I5 M( Q
- const
; Y3 N: J1 P& Z/ v - eConsole = $00000000;# s5 l0 ]- z! ^. F8 R, C
- eMultimedia = $00000001;0 Q4 Z2 K; T6 E/ p+ {
- eCommunications = $00000002;+ t+ i# y5 u2 e* ?, b' b3 b6 y9 {! Z9 ~
- ERole_enum_count = $00000003;3 U% h% F) R0 r+ I" m/ g9 A2 Y
- : I. X+ v T; `. _
- type5 ?0 c0 |: d1 B0 X
- IAudioEndpointVolumeCallback = interface(IUnknown)1 P1 E2 r+ o& G: y6 W
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
1 ~" g$ F( t O3 q9 W4 O$ G - end;
. b6 l' y0 a/ b0 M4 c
! W& X1 | B" R& B' r) z- IAudioEndpointVolume = interface(IUnknown)
9 F" I" I9 c0 }$ `; j - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']; O7 Z# x% e6 r: _0 s
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
. L& |! B9 G' {& |) m* Q' B - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
) c, j. g! d0 D4 {' @2 r" a) D - function GetChannelCount(out PInteger): Integer; stdcall;
2 }8 K) b( H* `* v" R# r" x( D - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;6 V. P) f/ m6 f' Z$ u9 W
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;$ {% k5 a* d& Q6 \( e1 w
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
! O' U8 b! n) r$ |2 f1 O' F+ D - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;# l( K0 Q& D9 y7 V1 l4 s" R
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
. z5 X% z/ C8 `( D+ k - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
8 b- ~7 f5 y+ f) ]/ r8 W1 Q& g - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
5 L) u8 x2 a# c3 S ~, ] - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;8 e3 w7 @4 F- E4 n: a, R1 G" ]4 b
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;' }; Y( g U! W7 {1 Z
- function GetMute(out bMute: Boolean): Integer; stdcall;
) _( n( B1 f/ P ]& m2 B, z - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
; c5 A% u$ a! u2 v1 M - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;& _- ]7 e; {9 q/ y
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
1 L( }+ m! v' e* s6 n# P8 g& h6 r - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;# N; i. ^% J. ?7 h7 C
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall; ^" F2 T) [7 A6 m: p* w
- end;
1 Y% F& j' I$ [) l, `+ ]
" _8 u! w/ z8 R i, D$ o- IAudioMeterInformation = interface(IUnknown) c* ]2 K- B7 `& u! M
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']. }& G; V7 @3 x, {
- end;
: L7 Z" u: |2 q8 y2 B' g - 9 m" y L& Z7 k
- IPropertyStore = interface(IUnknown)
! }( L5 t6 v7 Q - end;6 H1 U0 e5 V5 \/ T+ J9 E1 D" u, X
- . a& x) J" T( x6 @$ c
- IMMDevice = interface(IUnknown)
9 G% L& C4 Z+ o8 k |" e - ['{D666063F-1587-4E43-81F1-B948E807363F}'], j4 ]% }" {- g
- function Activate(const refId: TGUID;" h' C- }& R& x* }% V
- dwClsCtx: DWORD;1 I% k& p# `* S3 S
- pActivationParams: PInteger;
5 C2 L! i; _4 v# T' J- q - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;) l% i0 m: b& u. ~. g
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;5 I1 x# O+ P% k$ S" W2 B9 g
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;" ~+ U/ w+ [% w/ l7 K
- function GetState(out State: Integer): Hresult; stdcall;- Q3 h5 x6 {; Y4 y% \& w
- end;$ \. n4 X9 a' m
* T5 E& I( c' R0 Q" q4 W2 e. z6 c% _- & A4 N5 ~1 F7 K4 k1 F
- IMMDeviceCollection = interface(IUnknown)
. P5 H8 [. M5 ` - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
+ h. Q8 W k! N# W. v! | - end;- N7 a( b1 v4 v2 B
- / M9 ~; g1 S$ m: ^' G
- IMMNotificationClient = interface(IUnknown)
+ `9 N3 x0 k; d( f2 ^ - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
, |* h9 w8 D/ E) ` ^ - end;/ v7 L( s+ M* |5 p `; O# a( F
& @, N$ m: D3 L# S Q6 M( G- IMMDeviceEnumerator = interface(IUnknown)
" r& n# q& T; P - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
/ O/ }% U. o7 j1 j9 U/ n# e' e* S - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;+ y- E9 N( B. _) W" d0 Q! S7 j
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
) h& ^7 ?: I( H0 A9 U9 ?2 a - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
* [* F9 X1 e5 I& T - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;- ?- {5 V' B4 P* b0 s! O
- end;# u* ~7 c8 I* `2 L, _- |2 g
- . }) h) O& G g3 R; P2 q) q# D
- implementation( m& s" Q4 W) H/ D) o
- 8 Y7 L$ `+ A, P5 t$ d' m; E; V2 Z. n
- end.
% s! X# Z8 p1 @; D( p" H0 C, e- x
, {1 Z4 W; Z' h; d% t- ///////////////////////& Y- _: P( a! c" s
- simple sample :)4 e k0 w. H! t# R% A
- ///////////////////////0 q* B6 E- p5 l$ W0 }# V+ x
- 2 w" G( n5 |& F+ ^; }
- //...... other code
7 I! J& Z2 ], E7 d$ A" L+ ]# ?
x& ~: t3 r7 w& [. R( v% R- uses ... ActiveX, MMDevApi, ...;, N `5 K5 f( @, j: U5 e. r
- 3 c# U4 g7 l# I7 k! |! F
- //...... other code
. ]) s9 @, E f8 Q5 a: S4 o
$ `' p# | S0 d6 p- var
$ y# N5 i. J7 ~& Z: l - endpointVolume: IAudioEndpointVolume = nil;
) _3 |- Z/ l; ^8 e. \ N( Y - ; E/ V) q0 l# z
- procedure TForm1.FormCreate(Sender: TObject);
# X% B0 _ c/ h- Q - var" g# n2 k0 ], K3 M0 n
- deviceEnumerator: IMMDeviceEnumerator;
/ Z s( V- w9 w2 R - defaultDevice: IMMDevice;. X- ^* @3 P, r
- begin
1 z$ F, {& b9 X7 E, l: }: q - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
& v7 Z+ T9 T# I! r3 e - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
0 R# @! Q. E6 H3 I: p - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
f8 P4 F* i2 d% ~# V - end;% ?; g$ L5 t5 N- }3 r- Z
' ^9 q" B' k+ M: x* k7 k& X- procedure TForm1.Button1Click(Sender: TObject);
) x% {/ c, w- _7 I - var) D. V& p% X9 q+ J, m7 e
- VolumeLevel: Single;
+ g6 W7 }0 j6 Y% n3 [; x* H2 _3 l - begin
5 K5 J: \' |5 e; @3 _" I8 a4 V - if endpointVolume = nil then Exit;+ D1 }& c1 P* a6 S0 u9 @" C
- VolumeLevel := 0.50;4 W( i X8 k: j! f2 b8 H
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);' h0 O. }7 @; P( N" I
- Caption := Format('%1.8f', [VolumeLevel])5 R& `, I3 f* Q7 p1 |
- end;
+ m- ]8 r# u+ B' T. f* K
5 j& X8 a8 S' k! I) T* w- /////////////////////////////////////6 C. _& ?" D9 v- S0 D" ~7 T/ y) v
* b% w, j$ k2 x% a* y3 K7 V- // with best regards ToxicDream
# h7 ^0 \- [8 A0 D o
复制代码 |
|