|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
; D# d/ \9 F* w* f. s6 QBy Mukta & ToxicDream
2 B) y1 S( a& u! f# f0 \- //for delphi 5 v1 Q& }! x) q$ W# Q1 ^
- unit MMDevApi_tlb;7 Q2 z8 j, Y% N( L) O
- - i2 s2 N( h0 d) J% A, y7 K3 x
- interface
9 W2 l1 M. U( t( H% \& }6 ^4 t - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
. z# x5 i$ u7 h" P* Q9 N0 E* ^& g - const
+ D R5 y- j, N+ n+ ` - // TypeLibrary Major and minor versions+ W% h: K% f5 v. s2 H4 n
9 q$ K J* {4 O- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';/ L$ D0 h, N6 M0 }: j& @! x8 T
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';9 d ?- o7 z4 R0 \7 c) l
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
% M% C" J# @ ]. D - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
, M9 ^! M% x$ @; t - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
5 \4 }; l C; p& _2 F2 h2 @: _ - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';" |# g8 ]3 Z4 L0 ^/ `
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
% s7 ]2 G |: _% |% q9 O5 d
$ q& b3 i* R2 _) U. E- DEVICE_STATE_ACTIVE = $00000001;
: k& B1 m" T$ z8 E% s [4 H; W - DEVICE_STATE_UNPLUGGED = $00000002;. R* n, \: |- c4 }" Q
- DEVICE_STATE_NOTPRESENT = $00000004;) o e- E" r7 B; i; |
- DEVICE_STATEMASK_ALL = $00000007;
3 w: L. v D# _* f! F - ' I% U* r5 n( Q
- type
8 @% Z' l: A8 v5 Z1 Z - EDataFlow = TOleEnum;3 B# G. m' J% a
- const- d' @/ K' j% j5 a6 q/ f
- eRender = $00000000; B8 d7 c) y5 p; c4 H3 h8 O# {
- eCapture = $00000001;
4 C9 L2 j6 g; h0 l - eAll = $00000002;3 j8 T0 z( W4 @$ w1 \/ j' E/ f2 Y
- EDataFlow_enum_count = $00000003;7 W" d/ G- j- N' U e; S/ G: I8 s
H0 L8 }! H- Z' Z: \% |" A+ ^- type
- j# \( Q5 A, R: S* A8 e - ERole = TOleEnum;
7 F/ f+ J& C* A - const
8 v* e. n7 M8 A. ?; p - eConsole = $00000000;+ y4 x7 b% p0 ~
- eMultimedia = $00000001;% B j. h# g5 l& {: E) f
- eCommunications = $00000002;' [! U% ?: g6 j1 z& W- T E
- ERole_enum_count = $00000003;
3 d- z" f& H* |+ G, J( d U0 M, X - 3 |6 d* Y# `# x# `/ E# a6 t
- type
$ k- M9 o9 {& t! r) V% \ - IAudioEndpointVolumeCallback = interface(IUnknown)
p- ^: U4 i# V( E - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']* U( E }. @" d2 j3 y
- end;4 d7 n3 e) A3 r5 y7 y |
3 S) L) _( Y0 Q8 w" D6 ~. O: ]- IMMAudioEndpointVolume = interface(IUnknown)0 U/ g; ]$ F; t4 s1 ]* i
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
1 i; k( x6 M* W7 q( r! o7 E6 D$ x' D - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
! Z/ k% z6 [0 ?7 J1 T0 q - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;; C. o2 m& ^' U! D6 s
- Function GetChannelCount(out PInteger): Integer; stdcall;$ f0 n; U0 X. w3 J: C
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;/ {# ?: o: r# ?
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
8 m$ \; K) o) g4 U - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;1 T3 N5 l9 _+ c: P- e4 |
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
+ u$ J5 {, z) s8 V* s- X - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;+ r. M, P) R4 f9 \2 ]. u; F: r
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
; O2 Y3 d6 r* n8 R% j - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;7 z- c1 _( f' o( \6 {4 w# F
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
- ?0 y$ G: N* t( L3 b h9 i - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;7 a4 a# m* b/ O$ T \" m1 P5 O
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;
5 L0 s9 S- g$ s: U6 S# B - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;8 `& W( r8 n0 ~
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
( s) E6 W# f. { - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
) x' u' s% w0 A6 \! N - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
6 ~9 ^. }5 |7 N8 t - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;: Y4 D n" x, d( b+ H" _5 w- ?
- end;
$ Y' D( F4 t, c; z. X# I* } - . A; W% V1 ~+ H' c* A& i
- { IAudioMeterInformation = interface(IUnknown)+ v8 S5 \. \, @1 n5 C( Y
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
4 X0 U! I9 g9 z7 ^5 E% [$ m7 ? - end;}# o# P. l0 a& `% I# r' @& {1 @. f
' w$ P+ A4 v0 s0 U1 |8 w$ H- IPropertyStore = interface(IUnknown) d" J# H9 h* L$ K3 {
- end;3 V9 ]9 q! |/ q
( v, t- G( o1 N6 l- type) k1 k+ |9 @+ _
- IMMDevice = interface(IUnknown)
9 L) T. G; F1 l7 |3 k3 b% p - ['{D666063F-1587-4E43-81F1-B948E807363F}']0 ]5 l' A- A7 [0 {
- Function Activate( refId :TGUID;8 l8 V" s% @- L+ f$ i( Z
- dwClsCtx: DWORD;
- J0 m- V' t" m3 m# L$ e - pActivationParams: PInteger ;
9 s i% C3 a( ~* v, Y5 S+ v7 v& B - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
3 f* d7 _' E" l1 \ - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
6 m5 |* l; c7 @: {, C: r+ x - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
: \: A; q5 o R; W7 c$ z - Function GetState(out State :Integer): Hresult; stdcall;
% E" \% A7 M$ H1 e - + G' a& Q7 H& r- y+ l! C' G( t& g3 m
- end;+ O" ]8 N+ A+ R0 S9 u: H
- 2 M; D9 o% t" u7 X. _: O
6 R7 m* ~( l7 ~- IMMDeviceCollection = interface(IUnknown)5 v0 a" v; o# U* w! {
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
4 b8 n# v% v% A) S8 P$ O' P - end;6 v& p" E2 K, l: ]' \
- 3 t _5 c: j8 B; E2 {. G
- IMMNotificationClient = interface (IUnknown)
: s9 s6 f: C0 X3 n, H$ l0 Q - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']6 M& k( V* G$ w7 k, G1 z
- end; m2 m- f' }% B9 I, Y2 {
2 W9 r. `/ F( n* @- IMMDeviceEnumerator = interface(IUnknown)5 H w- d$ n" o j$ v/ n1 G
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
6 x8 [: a8 g6 J4 R# G5 v - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
) T2 U0 _; j( Q! F - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;( A m! X W( y7 h/ i. a
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;& S2 K2 \1 ^+ T0 c! Y+ K5 B# j
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
5 b9 Q" T/ j: e, n" f - end;
h. p5 F/ q# ?1 }1 _, L: V - % {9 M8 ?/ D0 [2 R* V+ ^' d
- implementation# E6 m6 T2 J2 y+ {/ g5 ^; y) n
- end.3 C! s! H6 w( @0 q
- 5 U3 ?. V; u+ W2 i
- Thanks & Reagrds,
0 c2 N! U* E: f9 q( W - Mukta ...3 S5 o7 p2 u; Y2 ?
复制代码
* t: d \% @7 G- U8 y1 }2 _( s3 J- it's work in Delphi 74 r7 e. ^; i" s+ e$ S$ a
- //////////////////////////
! d* u* }8 D" \1 ?( w6 x7 q+ v: |
% I" d! `) S5 x- |- unit MMDevApi;
( D+ `+ ~, c% i: \# a
+ U9 i( {* ?: s6 B: E) g' e- interface
& m" X& G0 p6 t1 v+ _# h - + T, v; y! H1 B: M
- uses6 r; S, ^/ R% \$ ]# Q, E. W! p
- Windows, ActiveX, ComObj;
- F% Z$ ~1 U" `% B6 F( R9 c - 1 C% j6 X3 `3 ]: Q+ u/ k U
- const2 ~* C+ u# v5 [
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';( W" G3 S$ L0 s- G5 q" C
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';- x. u( S7 K q% b1 z! e
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
' A+ S' x9 E( c5 S - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
9 x, Q3 p! P. J" J8 D - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';7 Y8 ^, K$ p. b
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';% Q c& O! Q1 p4 m
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';& ~) g1 a9 t- e. l. L
5 u/ I( t) W, G6 O8 D- DEVICE_STATE_ACTIVE = $00000001;/ L# C& i3 S: N6 ]- A" S
- DEVICE_STATE_UNPLUGGED = $00000002;( T0 b: l* Q9 {/ H7 R' M
- DEVICE_STATE_NOTPRESENT = $00000004;4 M! X% P; r- H) o5 `4 U, q2 k) j/ ^
- DEVICE_STATEMASK_ALL = $00000007;
. c& A, c$ H& H) |9 C
! y* @; t J3 }- Y- type
1 y% ^5 x5 \; s7 E! ~ - EDataFlow = TOleEnum;
* j# Z" G9 p- |* _" W6 O9 b - " c' J& C6 U8 I u- i6 k% S$ A `
- const- G6 N; w% N3 J6 k1 l
- eRender = $00000000;: D9 |3 \/ |4 m& T" x
- eCapture = $00000001;
: ]0 Y* m+ u9 t7 k/ J - eAll = $00000002;, y- a& K- q: e, [$ ^
- EDataFlow_enum_count = $00000003; ~2 C1 a3 F# V' _: n7 U
% o) J% [( }* h8 v( V3 ^- type v) a! v, l) Y- t& o& m5 R5 O) D
- ERole = TOleEnum;
! z' R( P: _* z! O# o$ f" q& k
/ [: S5 w' o' ~* L( j' C- const
$ m0 E# `$ B ]9 ^ - eConsole = $00000000;/ N7 k/ m( s9 k: N6 y
- eMultimedia = $00000001;: H9 b% B0 \# B$ @' [$ a6 W
- eCommunications = $00000002;
$ Z; {" B: y- R* F# L9 U. Q - ERole_enum_count = $00000003;
' ~# v3 o6 X U4 \ c" M3 y2 G- I1 ?
+ Z! `6 r \, \# M# z- type, G6 g% p$ N3 i! l( c- O. _
- IAudioEndpointVolumeCallback = interface(IUnknown)
" h% e; I" G+ B: s2 m8 F0 S5 A - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
7 g5 f9 N3 E N. t5 `8 z7 K9 J+ p/ j - end;
5 q" b3 ]5 r4 O% w - ! P z! l0 D+ h' m' V; _
- IAudioEndpointVolume = interface(IUnknown): F* A( C j1 l) x! }" e" @
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
; s6 D( h* t- w5 n; N C! X5 q3 n - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;, u4 ?8 k" v) ]2 o0 ^
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;2 C, p N+ q4 V& H$ [8 V# Q
- function GetChannelCount(out PInteger): Integer; stdcall;
' a3 R, U: m; I9 ~9 D2 Q - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;6 `( e/ N% H4 Q8 e3 ^/ h
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
( {% N6 F, u0 M% n" T' M6 u - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;7 U- B$ c f! v" }
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;0 x. U) \( {6 G! h& E1 Y$ \
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
7 \9 o2 H8 s. Q - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
+ ~: h2 n& O3 Z" a) c - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
5 d' E7 m$ u9 m0 } - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
* W0 v f: ~: s) q' T - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
0 y( i" s' h @) O - function GetMute(out bMute: Boolean): Integer; stdcall;. J1 R' T5 h2 T- C6 r$ C4 s' ^
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;& P" i' w8 u+ `# C7 o
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;6 T/ Z, Y1 @( \$ d1 y# i& |! u" j
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
" u( }( ~- N2 c' U8 }: X; f- ` - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
2 w4 ~' f2 R( O - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
' I% ^1 t- U+ B% T - end;
' ] D$ G: s6 Y9 [ - 0 j- M7 f$ ~4 _6 S& t+ e
- IAudioMeterInformation = interface(IUnknown) q9 m3 p* j# Q; l+ Z3 A$ ?/ S2 C! T
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']$ z* I9 }$ \9 D% c7 x+ `, O
- end;
9 d3 u+ x7 Q+ Q( U4 r - 2 l* t9 ^0 r- F' \# r c n' q
- IPropertyStore = interface(IUnknown). W6 p* ~. [, D' Y
- end;
& J2 w3 j% _% N! S: ` m
7 A; i* t& I: @3 L- IMMDevice = interface(IUnknown)
# {" ]$ f' A! E+ q - ['{D666063F-1587-4E43-81F1-B948E807363F}']
$ E' g5 f$ V( k( U - function Activate(const refId: TGUID;
0 R# Y0 B% { C5 F - dwClsCtx: DWORD;
8 {6 b [* @7 G; e - pActivationParams: PInteger;9 u9 R$ |3 r: C' |* q
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
0 x5 A0 m4 l, R' H - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;; q, U. Z! Z/ X8 a/ _* O
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;! H! ^- y' A& |$ }; e$ R
- function GetState(out State: Integer): Hresult; stdcall;9 Q+ }# T' V; r% @& k
- end;" U( R* `, f7 K* b2 K' a
: d( O$ i# U' I/ @) }- ! |* u: Y: ?+ `
- IMMDeviceCollection = interface(IUnknown)8 p3 [/ F( Q. P# Q# [3 N) Q c( `3 x
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']7 B0 f1 I& t5 y7 o1 u% x
- end;
" w7 h8 K2 U4 S& q; v' [$ p
. P& d$ C& d9 m+ R5 f' B2 [& l- IMMNotificationClient = interface(IUnknown), ^ m1 l5 q' H. S l/ d' b# M
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']4 {; d' y9 E5 _
- end;! K. v7 L# N0 U( u
- " Q+ \4 D2 S+ j1 f
- IMMDeviceEnumerator = interface(IUnknown)
+ \4 T- a, H; U% x3 G5 f5 r1 @ - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
: T' a9 t$ x2 T5 H - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
1 @6 n/ l+ y+ q) Q5 q# R* w& I - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
! T g: w2 j9 A5 c; ` - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;( Y) y4 T3 T- V1 ?" ^+ J$ @% \9 v
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
1 a% t9 |: M0 { b( P - end;
! \5 L0 m/ z9 ^/ v1 q0 y6 Z
: {: c: ~4 ~8 w- implementation
1 F/ s+ Z0 }! R% S# b9 u, L
" d( g6 p2 o7 W8 x0 y$ s0 _( t; D- end.
$ {. m: R6 T- D6 F* Q& g" @( _ - ' ?, J. @# d: a7 n
- ///////////////////////
b" ?6 W8 q; n2 D6 g" _9 m - simple sample :)& P& l) m; P* Y1 U' J% j/ ~0 p1 c
- ///////////////////////5 q% @9 H6 N4 I- n# J
- ) s- y H( Z5 U* {* L: m- ~
- //...... other code. T% ?+ w o! Z, l a9 C* K
- . r+ K: l/ t8 d7 w
- uses ... ActiveX, MMDevApi, ...;
# B/ P/ b; r+ e# ?. F; r - 4 ?/ q6 [9 H5 Y$ ~, [: M
- //...... other code8 o/ [. J- e# C0 y2 g
7 h1 s4 d3 l0 V" h Q: z9 f8 U- var. r2 w" k! t6 I# f5 L; U
- endpointVolume: IAudioEndpointVolume = nil;
0 E, n. Q+ f, f6 {" [' r! i - 0 e9 ?6 y* S0 q# g! N8 g( s
- procedure TForm1.FormCreate(Sender: TObject);
* l+ \& y P7 q1 S' G) Z - var
/ K+ T6 C) ]3 S) |! @. V" c - deviceEnumerator: IMMDeviceEnumerator;0 T5 _( }5 M3 }: N
- defaultDevice: IMMDevice;% z! V% \4 \: V6 f
- begin9 z0 G: m! Z. i. U8 L$ M
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
2 S# _. d! R$ X( V - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
9 q- E2 B3 n% d! w. N - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
( H+ P; _8 Z/ p a. | - end;2 Q. v$ F7 h9 d
- 5 u9 a+ L7 b9 b0 ~+ ]
- procedure TForm1.Button1Click(Sender: TObject);$ Y3 |( S z8 |! D+ p( D4 s
- var
! e6 _% |; J% j4 D0 R+ T3 g# q - VolumeLevel: Single;( a' |1 P1 O; H5 h% X4 j/ f+ Z
- begin. ^! q! M8 H: @4 [' W8 W V
- if endpointVolume = nil then Exit;5 `& B: R. \' `! z) \
- VolumeLevel := 0.50;
! Z9 H' ^7 Z: L/ @& t# | - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
0 j- _# b! |1 W L - Caption := Format('%1.8f', [VolumeLevel])
6 ^+ T$ f( s( x' i7 J - end;
2 I$ m0 S! m c0 l9 v/ b+ n
2 N5 w0 Q3 t' A2 `$ j, b- i- /////////////////////////////////////
" U. e o: J* d& z
3 J% ^# Y6 d. c! i" v9 u2 ]- // with best regards ToxicDream
) P6 z1 Y ]6 \
复制代码 |
|