|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0584 ~( R. T4 T' P$ U. B3 {! Y
By Mukta & ToxicDream- - m3 D' ^1 x+ X' D5 ?
- //for delphi 5
) z! u g' z! | - unit MMDevApi_tlb;* o& P2 w2 f9 z9 ?; G9 u2 Z
$ [& R: m/ d) U( a- interface+ }+ w0 {; |: w6 q2 B
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
4 H+ E1 \0 \' o1 B - const( \# k0 x+ p; b- |
- // TypeLibrary Major and minor versions; V/ e1 U) f- A6 ?, j
- , |( p: b# b D: p6 a
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';) v7 H- e: h3 m) z# B: p+ V
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
$ n6 R2 T. }3 Q# v - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
q2 U9 P4 \' L: w - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';% _1 B P" \- v
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
, H# b# w; D" w/ K I+ b - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
# C" r- i9 ~: p( L* E2 `/ |9 k5 u& f - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
$ Y' a& @* D4 D
; B7 U# g2 |% u# L+ D, V$ k- DEVICE_STATE_ACTIVE = $00000001;' w6 s9 U" l w5 i# \
- DEVICE_STATE_UNPLUGGED = $00000002;+ `7 F% S0 k5 K5 Y$ _
- DEVICE_STATE_NOTPRESENT = $00000004;
, Q9 ^" @" R- f6 S - DEVICE_STATEMASK_ALL = $00000007;; g1 F5 p: x% a& H0 ^( f% r; G
- ! S/ z, [! F e4 M4 ?' v
- type
' [; k5 L2 B, q& F& V" h9 S' k- c - EDataFlow = TOleEnum;8 U# @: X2 A' Z
- const
" `( {$ y+ N. F* R( I3 K; l - eRender = $00000000;4 L3 f% _( m' P# g
- eCapture = $00000001;' ]$ d8 i& X1 d: S5 p! ?1 ?; `# W
- eAll = $00000002;
! W" V; Q/ e. r A# i2 k - EDataFlow_enum_count = $00000003;
6 X6 v0 N `' l" p/ ?0 J - 5 d+ `% W5 H" O9 ~# v; P9 q! x8 T: U
- type$ s* j% N9 X8 a X; T+ T5 q0 [3 T
- ERole = TOleEnum;- X, a9 {$ w: S/ `- ?" ~& f( \+ e
- const
) p: X6 _% N4 \) P) \, K, J- P; G - eConsole = $00000000;. Q6 j; Q/ d) d! k, b
- eMultimedia = $00000001;. u. v; I4 m+ U& [9 p
- eCommunications = $00000002;
) {0 x1 o' P' o) m% o; P' I - ERole_enum_count = $00000003;( x8 n6 f' }( W$ c; W
) q7 }) S9 c* o3 V3 |- type
z8 A% |% X0 m! D1 Z/ \ - IAudioEndpointVolumeCallback = interface(IUnknown)- F. C& e9 o Y9 X3 M
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
" c$ g9 W1 `" R4 Z0 L2 E - end;
- @2 m0 p. U1 N, K
P, V* T5 v! F2 i' U- IMMAudioEndpointVolume = interface(IUnknown)( [ ?. u& V7 i: \8 d
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
% ?9 }: u1 e4 r+ c; [1 d - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;9 B6 k! o& P/ k8 v
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;! o; i! P3 n" ]+ z4 R. H! _
- Function GetChannelCount(out PInteger): Integer; stdcall;
+ l% z7 r+ b% x( L4 a - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
8 V5 O# D: K3 _$ ^2 ~9 i - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;& q1 L" T2 h. p$ Y
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
7 R; x8 v0 y: E& X! s: B5 {: o1 T - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;! A; a) e/ f2 a; U$ G3 _
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
( I. i# K. f( j - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
8 g. W" h; Z$ S9 `) Q - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
" q3 e& l5 ]% s3 G* O - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;, c/ g; D. c; M# E, k
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
1 r. Z% J' l& I7 w7 [% \& u4 h - Function GetMute(out bMute: Boolean ) :Integer; stdcall;
1 K0 l: z4 o; D - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
7 v- W4 |' f- O# h6 b - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
; m$ M2 f, P. [( i0 f4 k - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
+ e- H0 E/ S% u7 b) n - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
5 d& V+ C: i' D- q3 g. g! T - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;0 ^, W. E- {, |/ E, V# ]* `4 l
- end;* W' G, K, i5 | r
/ h9 D1 I6 b1 {' c! M' Y" E" g( E5 Q- { IAudioMeterInformation = interface(IUnknown)% M( v' y8 p& B7 k" l* Y3 q E& g( \/ a
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']" [( m$ J! d5 K0 \' Y* s$ f
- end;}) ~3 W6 k# n+ f: M
- : T4 `# h+ D+ a0 Q8 b3 W
- IPropertyStore = interface(IUnknown)
7 h' p6 p: |* ^4 f. d - end;7 r) i, v& t8 _# x9 U9 b
/ r! w9 T0 E' [+ s# U- type; b1 Z/ X0 Z1 p* W
- IMMDevice = interface(IUnknown)# i z/ d& [. A
- ['{D666063F-1587-4E43-81F1-B948E807363F}']0 Y0 U: F. n5 p7 U
- Function Activate( refId :TGUID;
5 M B& _; R7 Q- @# H8 e% A- {3 V - dwClsCtx: DWORD;
( Q1 Q: j/ C$ b2 J - pActivationParams: PInteger ;
+ [3 y$ U5 q! \+ C/ C8 i; y - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;0 ?0 t7 I" @4 ~- B) Z& l
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;( L7 o \3 J, E6 g
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
. P: v8 _9 p5 Y0 ^# I - Function GetState(out State :Integer): Hresult; stdcall;1 Z u* C9 ~$ r; y4 {& S; Y
4 d" J3 z% y5 W {) k- end;
/ E* s" A0 i6 n. F1 A - * O% a$ ?' F( ], Y" J
- ' A; j( I5 y6 l4 D& W5 p
- IMMDeviceCollection = interface(IUnknown)
}; _$ l* M0 J+ l. _+ D, P. I# G - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
/ @7 x' P7 X, v - end;" M: c$ a6 a# w( T2 [
8 X" h3 T* P! H$ I: b- IMMNotificationClient = interface (IUnknown)' |# J3 P$ [7 G) a
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']6 F' F% ^* \" m+ R& B( L1 h
- end;
* i3 C+ j: L. ~7 P2 M; _( H
. w: r1 P( m0 Y( ^0 T; M) S- IMMDeviceEnumerator = interface(IUnknown)
: @! d# u2 j/ V; t5 ]8 j B - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
6 y3 y3 l4 a$ e8 ]/ A: R1 [8 z - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;& I5 Y5 m# e" p2 O) }7 I, x9 t
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
3 Q) E% t& S+ x) w G( c) r6 s - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;3 H) y8 S9 m" \: h& }) `( \! t
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;8 H8 l" F# b9 p4 ~0 ~
- end;
; m# P0 E# w! E! a
- e- p: \/ F! q0 c2 O- implementation( s& Q$ m! N# J
- end.6 G& C k2 g6 a: Y$ v
$ O) J' b$ o0 O7 ^- Thanks & Reagrds,2 Z! o1 y, w' {$ a
- Mukta ...
% Y7 i+ h/ j/ C, s
复制代码
' p: @; b, e3 q9 Z+ P7 L- it's work in Delphi 7
7 a1 \, s6 A$ c9 Q - //////////////////////////, D5 y/ d6 s' h D0 }7 r9 U0 G
7 P! v3 ~6 m, |8 T' [) J @0 Q- unit MMDevApi;
: [1 M2 z! ]" m) Q; ]4 Q
. Q5 T5 F3 m9 ]1 }- interface
3 i! `! o6 z# L& h2 L. H! S+ ~ - 9 \& n$ u9 e0 L* P2 t0 J
- uses
; a- \ q' H6 h9 ^ - Windows, ActiveX, ComObj;
. \3 ~9 F: S( A" n1 l- b# w: R
( J- m4 k4 c$ Z; D9 _- const
5 I( }3 `: F( E: r. ?' r - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
# l3 q1 N9 M% s* Q - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
9 [1 P0 y' c/ ?5 i/ G - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
2 H$ w4 I( C3 V" T3 R; U& e - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
& Y, T* b; i ]# l - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';7 ?3 H6 j6 j6 k! z4 [% _- C. ?
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';1 u. Q" I4 y& \0 c9 d% {
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';0 O& i& ^; B: V( L$ j1 e# i
- 0 j6 B: Q. ^( P* q% k4 I
- DEVICE_STATE_ACTIVE = $00000001;; h/ a6 f1 Q* l4 `/ U3 _
- DEVICE_STATE_UNPLUGGED = $00000002;
: v& X9 A4 v: X K( N - DEVICE_STATE_NOTPRESENT = $00000004;: S' b) D( ?' p8 [0 ?0 L2 w1 Z
- DEVICE_STATEMASK_ALL = $00000007;7 F4 b9 G3 I+ R7 _1 Q$ J8 R
- 5 H' C7 u/ x- F! R. i/ R
- type
( A# w t! N) L( J - EDataFlow = TOleEnum;4 D# Y, j1 y' W- I
- $ H, z) H/ K- o m0 L
- const
* u1 H- }* k8 w1 i7 G# v - eRender = $00000000;
3 q, s7 O+ w1 v Q8 j6 g- j; \" P8 g - eCapture = $00000001;
8 Q9 ^- }7 w; P# @ - eAll = $00000002;
: E# p9 i+ s9 s. F - EDataFlow_enum_count = $00000003;
1 ` Q& l7 r9 M. S( ? - 7 E+ S& @# c9 C
- type+ X r G8 `! P; _! O
- ERole = TOleEnum;
( M2 f" X% a" B5 N+ B6 X
8 J; T a( |$ O% L6 e: T* \. p- const4 `7 c# j+ N+ T0 o2 ]% l; t2 ^
- eConsole = $00000000;$ u2 s6 d9 O2 @. d
- eMultimedia = $00000001;
m Q) B3 K0 l - eCommunications = $00000002;4 `) }5 C+ J8 n& s9 [
- ERole_enum_count = $00000003;" y u+ O6 Q% l
2 ^4 f7 F0 n0 u' i) G: L' k& L- type* X% q7 h5 i7 M u8 j2 N
- IAudioEndpointVolumeCallback = interface(IUnknown)
. ^$ V3 O+ w& Z8 }9 X* V+ r0 _4 X - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']1 \( }) C5 k" A+ U7 R9 N* c3 g2 d0 a
- end;) z9 i: Z" J5 t) j; j# G
1 F% Y8 T8 {" K% P- IAudioEndpointVolume = interface(IUnknown)3 x9 K: H) t0 ~
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']: B: ?) J" z% ~# S) G
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
C: M" U, j+ h7 H" F: y - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
; X7 D0 F* c5 p+ t2 o- W* U- h - function GetChannelCount(out PInteger): Integer; stdcall;
! M4 }# z% l6 k5 H1 ]6 _* G0 A' u - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
* p8 t9 N& n3 _9 W7 G - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
B) h e/ \, Z - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
( L9 v* X$ I4 c: H- y1 i - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;8 g5 N. F1 P6 b$ F/ W6 k
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
9 \1 W9 s: H) ~7 U9 s - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
( T1 A7 k$ P& c8 ] - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;$ f) {6 r) f5 |! M2 T4 } m
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
3 b) \5 Y: _3 E2 `' D" A5 Z - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
- N- R! ^# h/ E" t8 G - function GetMute(out bMute: Boolean): Integer; stdcall;2 o7 M9 }* S1 d2 n
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;* H, L( Z( {( K" ]: c
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
% N# J1 R. m( u - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;8 Y* T6 B) l. L0 M9 q
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;( ^. u8 t& R2 L' @5 A9 b8 h
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
6 ~/ V+ [& n' |) N5 k/ O& K9 a4 Q ] - end;
9 h: H1 P- X+ \9 E- [ - ( N4 V9 M# h7 S& m# D1 k
- IAudioMeterInformation = interface(IUnknown) c8 v" f( a) _7 W) n, l" N: {
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
6 V" s* L' i# i' N) ~ - end;. ~3 i* j- T+ i) e) L2 S5 t" @5 r
- 8 r4 o, `' K3 v7 v
- IPropertyStore = interface(IUnknown)4 p) ~* J" ^& w
- end;/ k( J; P4 h, @" b, ^& M, T: n
- - q9 u5 S9 e$ W2 s$ e+ n6 w
- IMMDevice = interface(IUnknown)
, i+ R, [0 U/ o4 m5 R( m8 M" G- k- J8 ~8 D - ['{D666063F-1587-4E43-81F1-B948E807363F}']
( z& p& q' K* q) c, E4 k( B0 M - function Activate(const refId: TGUID;8 x) k" s7 R, Y2 a1 {/ n6 `5 e# {
- dwClsCtx: DWORD;' q4 L$ @) R1 _% P# f' z' k* Z
- pActivationParams: PInteger;! O9 a. n" S* O. r" i# L
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;* ]* Q& i1 O' z, z9 Q+ Q! ?
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
- U. ^. v2 i% p5 h - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;. l7 C! N6 Z: ]! T1 m' Q# @
- function GetState(out State: Integer): Hresult; stdcall;! `' A# e/ w3 ]' p8 ^1 v- d+ j
- end;
8 o4 T- T3 J) ~
5 q, d+ t; W+ a+ F' S, _3 Y, G- $ |: W0 V' C: p) Y, f( n
- IMMDeviceCollection = interface(IUnknown). o5 s9 r& `% A6 ]. S
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
( @3 b; {! a. S6 x' u9 v - end;
; y/ x: m' E( @7 I) p" ^5 g& n
8 o V1 W: |- ?5 N- IMMNotificationClient = interface(IUnknown)3 [0 T/ k8 [ j) y" d! M
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
/ K" |$ j: I! H5 c# X - end;+ J/ T. Q' j- f, C: ^2 P+ o, Z2 w
- 0 s( }9 N4 w# @8 ~. V
- IMMDeviceEnumerator = interface(IUnknown)
3 w( `" D& ~1 ~0 | - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
' O$ R& k) Y; E; R - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;5 z, Y R- n% t5 d
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
0 ~/ u. N" n! l1 h. n - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
1 a2 e; |4 P: a8 n - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
% N" N% h3 l8 T* Z. i9 C4 S - end;2 K$ A; s# b# c: f
r+ B, J; P2 @- implementation1 o) T, t- v4 s
. \- ^3 o) B3 D- end.0 M1 y7 |% Y Z* G. [! l
/ j7 ?1 B% j* I6 g* @7 g# Q. U: X- ///////////////////////# D& P. j T& R& \! x) c
- simple sample :)
( ~9 `" j$ t2 c6 C - ///////////////////////9 a! v& g: [% h% n/ I c
% V# \+ o+ _) Y: S- //...... other code
7 t8 O' D0 z1 K- G - O: a. H' U, r6 J. S; C1 h
- uses ... ActiveX, MMDevApi, ...;
0 t- Q, M5 ? g - 7 \( a) Q( E. [( ?6 }( |
- //...... other code
! [$ H+ k8 C5 d1 J( T
$ P3 B5 Q& ^ O6 d: M; N+ [" J- var5 q8 J8 `$ |4 D5 ] }" e r. j" X ]
- endpointVolume: IAudioEndpointVolume = nil;
; r( W, [) V5 k) X) t( Z - # Z2 f" V4 N! K8 `7 r
- procedure TForm1.FormCreate(Sender: TObject);
6 q/ q& _+ |* H1 ]9 u% M8 N - var: K* |& W' Z% ~7 @, z/ l
- deviceEnumerator: IMMDeviceEnumerator;
. j! E! I* s2 V& w% i8 |( U - defaultDevice: IMMDevice;
3 g7 Z3 p' {5 N: `, V2 j2 z I ] - begin
r4 `* z' x0 b! I - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
: ]3 ]6 P8 v5 V* t. A! ^: `: J( [! t - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);9 `# ]# u6 j& v7 E e: @* j$ h/ b
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);/ e m/ p: Q/ x: f: V
- end;$ ?; W% \+ f( r; o. A4 M/ w: ^! f# q* C
" t1 h& [ B# E* r S$ n- procedure TForm1.Button1Click(Sender: TObject);
7 U& O& V/ N0 i! X% G$ c7 h - var; ~- g0 H4 j; b* p7 n
- VolumeLevel: Single;1 W! Z+ ^, o4 _, m% v( _9 F
- begin
3 S5 O/ j! J N- B0 P: y - if endpointVolume = nil then Exit;
' G0 [+ D, B* M9 r/ Z - VolumeLevel := 0.50;
6 c2 h( j6 x; D0 [" m, Z. B - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);8 s7 n6 b. |# \6 a
- Caption := Format('%1.8f', [VolumeLevel])
; W. W/ u8 Y- v; f4 t* J - end;
. b, n" a3 y) K* e) L( N, d
! E& w3 \1 I: O% Y0 E- /////////////////////////////////////
0 z0 O9 v, J* |3 {1 m
. c* w+ [& h/ _1 [9 X1 h- // with best regards ToxicDream: f" x8 E! u$ q4 U. j2 i
复制代码 |
|