|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0581 r# I1 D5 _) n% Q1 Y
By Mukta & ToxicDream
% @5 A$ y# r! q. J3 D- //for delphi 5# M8 O: ~! O4 X( c. {: b
- unit MMDevApi_tlb;
# l! S& T* t- _ q6 t% m! C4 d3 m - % Y) m; Z- n& M: S5 L" B
- interface
; f- i; j0 D9 R' J8 Y9 @ - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;* v& ]7 o& F+ b
- const
3 U8 l# z: v0 \( r+ d( p - // TypeLibrary Major and minor versions0 R9 c+ j* j8 K" U; n" C" [
- , `( O; j( x% b; E
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';; C; _$ {* \" |2 n
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
* z# s5 B6 x$ ^ - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
: y! x) b# r: Y" G - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';5 [$ y! n2 W8 B! S+ @" k
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';' z7 y- l" [; ^0 d( I
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';- B! j" A' r; m0 o" R2 s! f; \
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
; N4 D. N- q1 ?$ E1 k9 {8 ?$ t - / M: w# H! Z( y9 v+ V& o5 R" |
- DEVICE_STATE_ACTIVE = $00000001;! N2 [3 s5 D' S4 R: ]
- DEVICE_STATE_UNPLUGGED = $00000002;8 v% x6 ~, W8 x) u0 [8 g, \
- DEVICE_STATE_NOTPRESENT = $00000004;7 @1 P) K" v4 m: p( d0 h
- DEVICE_STATEMASK_ALL = $00000007;
/ Y# r* b2 c' I, L0 ?3 ^1 R1 }+ o
% l, u/ X4 m0 X- type
' _. _+ h: P! V5 g7 i; U - EDataFlow = TOleEnum;
5 e; s/ m, p/ M - const
3 z( B+ g/ e, S% z- c - eRender = $00000000;. x- t0 M! W q4 ^8 b: l* A" b. `
- eCapture = $00000001;3 q$ s0 g9 i" N6 w
- eAll = $00000002;2 l- H1 O+ _/ {8 j; f/ ~5 M
- EDataFlow_enum_count = $00000003;2 s" E$ z/ P5 l4 S# @: e
. i. a' z' o9 f- type
9 d3 C3 P1 ? s. I" G4 J - ERole = TOleEnum;
5 @' }! _1 Y: E: E - const, ?$ l9 Y1 M+ v, Z& ]
- eConsole = $00000000;
& j' k5 r; Y- V3 C - eMultimedia = $00000001;
& w& R+ x* N0 [ e1 p; A# V - eCommunications = $00000002;) }+ H7 _9 u! [$ P5 W% B0 I; [1 T
- ERole_enum_count = $00000003;3 h% S% X. p% P4 H& |- U* c+ `+ M
# A8 [: x$ m5 F- type4 M7 s. d* w1 r2 }# X( y1 X Z' J8 g
- IAudioEndpointVolumeCallback = interface(IUnknown)
+ f5 r. `6 q0 y4 \& ^7 @ - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']" \" O0 A# g) c- F" r
- end;$ w0 c6 u9 ]! Y% U' J" F
- & f) A$ h6 \9 T, P
- IMMAudioEndpointVolume = interface(IUnknown)" m* B0 b s' K8 _# ?1 k$ B
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
5 [! O1 i( k. Z2 C! { - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;* }0 ]. d$ |! S( F) ]. y+ T) L
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;( k& l0 o- W. t, I, I m
- Function GetChannelCount(out PInteger): Integer; stdcall;% y$ ?3 o: w1 Y( K4 P
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
5 c8 I, P( B/ f- W1 c$ s - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;0 i9 R9 _3 K0 v8 Q
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
) @4 p* g# |5 `( E$ ~) E# { - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;3 m' P, ?8 `$ D+ K- H
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
# m; g3 A" P! z- w# `, e0 Y - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
* n" G/ {8 T8 l( c1 o - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;. {% D7 \, T t3 ^: P
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;8 b" o4 q! y5 [( S1 t
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;* q: [/ P$ O: P2 w: L" p
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;. j: [, l* a; K/ e1 u2 W3 l
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
, H" y- r, X0 E+ ?9 I4 x a/ ^ - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;' O* Q! L( w% b% }
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
: Z7 h- @9 g3 G4 f/ b+ Q" @ s - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
' |8 _4 |4 C& M* ~. h3 P8 I$ k( w - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;" ]. J% T0 m# G5 |8 f2 _* ]5 }" U
- end;4 G6 {' |: y: W' {" a5 X1 ~) ?
$ \* v# N. H+ h4 s2 b- { IAudioMeterInformation = interface(IUnknown)
+ w% B/ [2 o* }# C- U: {, G0 C3 T - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
: ~0 ^# G. s. U5 G1 H8 M - end;}9 j2 k! d# U0 }) P4 |' O8 K3 }6 d
- - M5 y# L3 | z
- IPropertyStore = interface(IUnknown)4 `- T ]/ y1 b2 a: ]9 O/ R& g; Y# ?
- end;
) M# p+ _8 s' W v X - % Y! N3 B* S6 b6 k6 s3 t D
- type: R# z( b/ S% N6 ^% r
- IMMDevice = interface(IUnknown)
/ W9 }; ^" W' k/ X! X - ['{D666063F-1587-4E43-81F1-B948E807363F}'] p% U: X" K% j5 N
- Function Activate( refId :TGUID;
. A9 V. w0 E+ [; L" B' u# W- W - dwClsCtx: DWORD;
+ m) S; V3 }6 W( r% g1 e$ V - pActivationParams: PInteger ;; V( V0 C+ p7 ], u/ L" v. T
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall; K/ ^6 a5 }1 B; K
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;# ~- e4 H' O) z: D% h. @
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;5 J+ \2 m2 S6 N4 O9 O4 _2 Z8 L
- Function GetState(out State :Integer): Hresult; stdcall;
1 ~* j: f6 W/ a0 S4 |# g# v
) h* u) K, Q" _* P s; w- end;
& c$ C8 L ^0 L3 N
1 @" i# H0 N9 Q" H' B6 L- 1 U( L* J# G$ P2 X- O. D
- IMMDeviceCollection = interface(IUnknown)
* ]1 h1 ^( p. g - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']% [+ e% f+ U# d3 ?7 b& D# n
- end;/ f* A( _4 ^) ]
- ! R$ }8 Q. Y4 t3 O2 H! @
- IMMNotificationClient = interface (IUnknown); T9 L4 }# ~7 W( P; N9 x" U) I6 M8 f
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
& H0 r& O) b# w: P( P - end;
7 E" _# h) N+ ]0 W6 S$ O - 5 l' Y9 d0 I- D0 g
- IMMDeviceEnumerator = interface(IUnknown)! o7 q: w' b& p0 W
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']( E5 c Z2 I; _$ X3 [# ?
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
# u3 }- |; s* ^ - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;: q1 {- c. e9 x( e) X& ~
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
% x+ p/ P& h! L+ c$ U U - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
/ Y. |/ ^# I* y1 F0 Z G - end;- }: i ~% s& G
! p" _% P* u) F- `, J# K- implementation4 P4 k t, s& Y) i+ d1 D! u& K- }
- end.
* {8 Y! K8 C; q3 S4 q* R - : A. J+ e8 I" h, j5 p O _
- Thanks & Reagrds,
1 C" z5 _* V) ?; k - Mukta ...2 C6 j5 u; I) ?8 @ [7 v0 N
复制代码
; J/ A& b* M3 ~7 S+ P5 b5 b- it's work in Delphi 76 C4 a- t: a# |. G
- //////////////////////////$ O/ A& S: n P) Y( ~
- & U* Q. l5 K# x
- unit MMDevApi;
9 }8 |/ e- `7 \1 L# F6 j
9 V- |! Q$ S# h) F8 [- interface
4 ^! y. N; O$ W% g) @# f1 J j - " n$ U4 L j6 |7 t
- uses
9 G, V' Y0 m" ?9 |6 _ - Windows, ActiveX, ComObj;
6 H5 i8 `9 l' |+ a - 0 g: `% J4 ]9 ^2 `! a- i& t5 t
- const
! n; b/ v. F0 u- Q, O. l, J! }, g - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
- q/ m+ r/ K; z% r( u% i7 n! }9 l - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
; U1 T8 S E% ]. q3 n - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';( D9 P& u6 w2 x( J' D! O! Q
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';% i4 i- {/ Q6 P) E, W' a
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
9 t& ^ Q- }6 H9 V1 H - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
4 o* h3 ?9 F0 S( m! ]2 a - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
7 E, G; J, g9 c' r5 d - , H e8 @# o* s `: Z2 B
- DEVICE_STATE_ACTIVE = $00000001;
) p* h4 ?* r4 K8 f0 Z: X# c - DEVICE_STATE_UNPLUGGED = $00000002;
& \7 `# U* I( q7 u: G - DEVICE_STATE_NOTPRESENT = $00000004;
# S' N' X7 z5 D* P - DEVICE_STATEMASK_ALL = $00000007;" y d3 L8 N" C2 @/ [; O% u1 r
- } H4 Q' c( t, \! u$ G
- type
! X; m0 \8 y9 k; C1 R$ m2 u9 S+ m0 B - EDataFlow = TOleEnum;. E u- r+ R* ?% E+ b v; r/ W
- 6 b r+ t w5 b; j. @
- const
) j8 _5 l3 @+ E0 P. `0 s - eRender = $00000000;
% k: A; p& J& ~' N& x - eCapture = $00000001;
; l+ }' E$ c* t. S - eAll = $00000002;
$ W4 P9 L; n P5 g) N1 P2 Q; d - EDataFlow_enum_count = $00000003;
- N% i1 n( T5 @! Q; h/ [ - # g2 j- @0 V& M/ @" h/ E
- type
# u `" f0 r& T8 |3 z) Z ? - ERole = TOleEnum;
7 e- `: ?. G) y& P3 B
, g* q6 h! I( n0 D1 v9 A( s* l- const3 O/ I4 ^+ W k6 M
- eConsole = $00000000;
3 X9 x _* k1 L6 o. J) g) L9 Q - eMultimedia = $00000001;
' `( `) i8 x% u; q/ a2 G1 { - eCommunications = $00000002;% a- a2 U. A: m8 ?5 d
- ERole_enum_count = $00000003;% a3 z# l$ h- z) `5 a+ }
- 8 h$ z% B" S. ]' \+ t
- type
E4 X8 K3 q7 I p! e& u - IAudioEndpointVolumeCallback = interface(IUnknown)" y: p1 f; j( v. `4 h( F3 N% ^4 h+ V
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
?8 j* E& C& {6 } - end;) s4 f$ J) K$ t' p
1 \4 m& C4 J w- Q/ D- IAudioEndpointVolume = interface(IUnknown)
, [* ~. W% B+ q" r% ^, q' _ - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
' j7 I/ s, w" i- _- ~2 `- T - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
0 C( f6 n& o* V1 L4 m: e, _0 x, b - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
' J0 j, F7 w+ f ~! @ - function GetChannelCount(out PInteger): Integer; stdcall;6 O( t7 }6 ?, q
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
: c. C% @' H% T* \0 I; G - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
2 w* r5 B0 E- Q2 {2 Y) j1 F - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
) R4 k# p) } f" b) ]3 }, } - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
2 L1 V0 C) r$ l, T) M5 N - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
* J4 G7 W9 C' ]: J) v: k$ u, N" a# I - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;* q6 ~0 E @3 I- L; c
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
# I& u9 { x/ U; s6 H) ` - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
" e- A5 Q# v9 ]. `4 k - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
5 e/ A0 Y' E% g6 q - function GetMute(out bMute: Boolean): Integer; stdcall;
& e X- Q) A# V! I/ G0 \ - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;7 h# U3 L. g8 b& I" T
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;4 [( P: s. ~$ M& X* n
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
* f, c& H# u. n. ^" n( d, B - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
7 A% a0 [! Q# q0 Y& o; m - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
% m* r/ }& s# O; m - end;8 D; Q& Q5 p, _4 D0 D
1 |( \$ e6 u3 \- IAudioMeterInformation = interface(IUnknown)! H6 B2 X+ }; K) ]5 |' a
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']7 @+ |3 Q Y g7 N2 H# y# ?9 \
- end;/ K' i" g. P/ ~: @% y
- 0 l0 b: [ x/ y- T: ~, o
- IPropertyStore = interface(IUnknown)- h/ K8 O: {+ S X
- end;
/ R. R" j4 a' o4 @) R - ( V( r+ P) E1 t5 R9 [% W: a
- IMMDevice = interface(IUnknown)
. Z1 R7 G% _9 S/ Z* T, [: Q - ['{D666063F-1587-4E43-81F1-B948E807363F}']3 E% j+ i1 m8 y, s' q% U, w
- function Activate(const refId: TGUID;
* N, q3 m0 @& V8 B - dwClsCtx: DWORD;" a, [7 }, R: x8 [9 Z# Q* X
- pActivationParams: PInteger;6 E7 ~; k& k% Y; |4 b. ~: t
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;. V$ S2 ?( ?+ A# }3 V5 H3 c
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;! C; |2 P* E0 C
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
# q' @% b4 Z9 K/ J+ R - function GetState(out State: Integer): Hresult; stdcall;
1 v& z/ \6 }3 g3 v - end;6 q7 k) O! j6 t3 n/ {: B' D- e( \
- + Z6 F0 Z+ x' d! r
2 M+ I/ P$ w' A& I' D9 E- IMMDeviceCollection = interface(IUnknown)2 e" V! t1 o) X; u3 Y$ D4 x, Y8 I
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']" [# f6 R0 f" C% e/ K& N
- end;
( s$ i7 ~) K" A7 u - 7 V3 q( L( E) E2 y0 ^# ~: ^: m
- IMMNotificationClient = interface(IUnknown)
- P' A1 e1 G5 r5 p9 C b5 e - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
7 s" K w* A8 h/ e9 \* x8 P: H - end;" `9 g/ P" u$ M% _' J
- 1 H5 ~) u; r7 c( d( W) l
- IMMDeviceEnumerator = interface(IUnknown)
7 m3 P* a# t7 j& t - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}'] u( P5 ]% D& g/ a! E7 i1 M
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;* X( N5 |! \; |/ `2 @$ Z
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;% i* E( I; u. z- P/ v. t' T
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;) l0 u- s' s& _! H
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
1 p! u, F. b# _3 N2 Z - end;0 p. R8 R3 i* h: {, P! F$ `" m
5 j1 y, g- e4 B5 z9 @% ^- implementation
8 ?0 U X3 j$ q
( R+ z% @+ \9 n. G4 M! I- end.$ k. J6 J/ ]5 v6 Y$ p' s
) X3 p- B: P- ^- ///////////////////////
, N& j; p4 c/ t - simple sample :)
0 f, r# a! x& ^6 W7 i& } - ///////////////////////2 s; E9 ~. z7 n% F; m
- t0 b1 w/ m% O' i$ J( _' R7 T7 o
- //...... other code% U- y4 E( L% Y6 m
7 A+ w9 F: s0 H/ _- uses ... ActiveX, MMDevApi, ...;
% D' p) j. p7 P( a! D - ( i' e1 {/ h7 [* ~8 |, ~
- //...... other code) U. a/ Z% F4 Z2 n
. ?/ r% O3 h8 O3 A v& u! k- var8 V/ | y0 |; C7 b
- endpointVolume: IAudioEndpointVolume = nil;
! s z) R4 g; K Q1 J9 ~ - 5 n9 k- b+ t# e3 N
- procedure TForm1.FormCreate(Sender: TObject);
9 f- A! G3 I# {( x' { - var
: @" i- l3 f- E) n" X1 K B: D - deviceEnumerator: IMMDeviceEnumerator;* a9 j9 O. S: M) w- P
- defaultDevice: IMMDevice;
$ y! t& C6 N B - begin; t2 x6 \% `, v/ l- u* B
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
( P, K1 s, a8 g - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
/ }% z* {" p4 A$ i - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);/ o5 H5 L3 \* m4 l) m0 C8 Z
- end;
* n9 m" X" b7 I/ Q C: I - ; G" X# B& x4 u: Z# ~
- procedure TForm1.Button1Click(Sender: TObject);
2 d9 g. u4 e# I% E+ a: ? - var' m. L1 B, {* d/ V$ K
- VolumeLevel: Single;
; Q# U% }- N6 J/ w - begin
% A# u4 h' _2 ^; h5 O I* j - if endpointVolume = nil then Exit;% I$ C4 u. S6 c) D7 B w
- VolumeLevel := 0.50;
, ]: {" D5 o' R - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
5 u; ^' B/ C# g( x1 L - Caption := Format('%1.8f', [VolumeLevel])
1 V8 H3 G4 d# E; [5 ^ - end;
9 g! x' ^3 g, }$ f+ H) D* b+ s j - 2 D% B) P% n5 k( I2 w+ _, G {
- /////////////////////////////////////( w: [2 w7 Q/ [7 Y8 [
4 q- L6 l- r* i' t7 Z- // with best regards ToxicDream
. ?9 E, _+ [" G
复制代码 |
|