|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058/ q' u7 @! j7 ^7 w5 f: L* k& b; H
By Mukta & ToxicDream
5 b1 M d& R8 b: }7 ~" A/ L7 |! ^- //for delphi 52 E ?' }& B/ f! m
- unit MMDevApi_tlb;% r1 O0 Y# @ ^$ `6 k
W" `' J6 H. s P- interface0 P% m+ Z; u, ~2 ~3 }# c: o
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
9 }5 j' C6 G' I - const; N/ S. Q/ u! M% T1 s
- // TypeLibrary Major and minor versions
; Y, I% {( {5 N - * v7 @. p5 F) }0 m
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';" E3 p$ U" o$ C u- v" t/ x# R1 E
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';+ s& z2 h( D: D
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
$ o' q! Z) S6 n0 |9 ]& T - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
. M" h* {# t7 s; t' h - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';, H" \1 ]5 U# B2 `; l
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';% ^, [. ^9 f8 ?0 u
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';( s# z7 \7 n0 R3 }) T
4 l$ }* F. d: l/ S B7 B! D7 h, L- DEVICE_STATE_ACTIVE = $00000001;. r) h' u) h; z
- DEVICE_STATE_UNPLUGGED = $00000002;
( }, _7 [0 U# Y, E - DEVICE_STATE_NOTPRESENT = $00000004;
. h* S. C' \0 z7 i - DEVICE_STATEMASK_ALL = $00000007;
! p+ F2 G6 q, W! @7 f - . a$ h. s8 \6 d& t% Q
- type0 \. y2 G5 B H# @9 Q
- EDataFlow = TOleEnum; O" `4 `+ m: `) G
- const/ D6 }- u' d- f, R. @
- eRender = $00000000;
: P- p% {* E5 \1 b1 F' S5 U4 C! H - eCapture = $00000001;
5 W% ^' {. K# ?. R6 Z2 R - eAll = $00000002;$ S& ~" H% c2 n& x) I* P; T5 U: J
- EDataFlow_enum_count = $00000003;
8 ^) ]6 A9 f2 c2 _# l- P! W$ C - 2 c$ L7 w; C, ^% H/ l
- type5 \' |; R1 c t5 k
- ERole = TOleEnum;
- w3 o) d. G, Y- K6 W7 u - const
$ O% h7 f$ F9 r! u }5 z% r8 n - eConsole = $00000000;
+ P G% s! }$ \0 ^2 m - eMultimedia = $00000001;# Q0 t6 M& T- p; W
- eCommunications = $00000002;
) u/ }( f+ n7 P9 F9 Y6 X% a K& N9 F - ERole_enum_count = $00000003;' d: h2 ^5 Z: h0 { ]! m4 N
/ T: t& Z: v5 i( h- I# w- type
) c3 V& s7 y# g - IAudioEndpointVolumeCallback = interface(IUnknown)
0 S& Q4 m, e$ N) x+ z0 R$ ^# w - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']# C- R% ^( ~# n
- end;2 ^2 u# W, E. t4 X* S
" s( G- K: w0 j- IMMAudioEndpointVolume = interface(IUnknown)
8 ^# g* F/ {: l1 B% b* P0 p/ Y - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
& p: U6 H8 \) B - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;% u3 R$ F/ l4 |* e# [, P7 A
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;" D8 o" P ]3 I& K+ e
- Function GetChannelCount(out PInteger): Integer; stdcall;
' C: N) Y: N. o H; z- [% W; M - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
- M# F4 `2 B& J v" L - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;; h. C3 u" E% e
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
: h3 d# ~1 K+ h, r8 y - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;8 w6 G/ c% S+ p9 R" I
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;! n( [" s% p! z6 w4 _$ s- t
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
" d& Q8 d7 i% {) C1 } - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
/ g4 b7 s3 m& Z( F: G* n. o - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
' Q' A" Q' q' X7 m, r( a2 D7 D - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;. L h* D, w7 M
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;' p0 } X0 d+ p, t* i# P7 O
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
1 x6 D$ h4 L* x" r- k& ?, k* t - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;, q# e" E9 D% C1 z
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;: u1 C7 n) n" d! W P0 e5 a) X7 s
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
$ y. P' U! _0 U* U$ x$ I" a# K" ` - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
. N4 ]8 y% t% P! ]: B - end;
( s3 }$ f# [% S. ?2 X1 x
" e8 {/ H* f- O6 `# I c( n2 i- { IAudioMeterInformation = interface(IUnknown)# ~' n- t2 O. j6 N' r! y7 d" E, e+ K
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
+ s! c, X9 O' Y# ~& g% w+ ` - end;}
4 q$ K" Q1 l6 y, w- E: K) H3 { - 3 z" R+ `7 v( R: y; b4 K2 a
- IPropertyStore = interface(IUnknown)
& z z9 Y! @4 o8 G% t- |9 i - end;% M& u6 D) f" w' b$ d' A
. [1 O8 n! o1 r6 u! K- type
- j. P4 F9 ^" o5 I - IMMDevice = interface(IUnknown)
. V; V# O: k- n" X, ^. ]0 ] - ['{D666063F-1587-4E43-81F1-B948E807363F}']7 e J% C1 U" a( r" R
- Function Activate( refId :TGUID;% M7 I' P3 L6 h P
- dwClsCtx: DWORD;
) J7 w5 B/ ]) d, C; J - pActivationParams: PInteger ;
, ]- T4 m! F4 {, b$ r. ]! Z l - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
) J5 F* X0 @+ b3 m - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;- n1 A. ]% `8 H
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;8 }! z5 }; u8 B
- Function GetState(out State :Integer): Hresult; stdcall;
( V0 s4 ]. O- k, I* ^4 Y. B6 Y
# ]: K n7 ^# ~5 D7 d+ h- end;
, q, X) A1 ~8 f w - 8 o7 [, i8 i9 _. S7 h) R
- 4 e9 G P& t3 X7 m0 U( X$ W1 `' l
- IMMDeviceCollection = interface(IUnknown)
9 \# ?3 S( `( n A1 e - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
# ]5 {: Q( M1 J( E. q" Y0 r - end;2 U/ _8 x0 z* Z! e
' v% T$ i) [5 J! \- IMMNotificationClient = interface (IUnknown)+ y( l ~2 c0 i1 A( b+ X3 T
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']( e5 _, ]8 M- G g8 m
- end;6 }6 f) N/ z1 U5 @, h
7 n- h; k3 p) o, S& l& l- IMMDeviceEnumerator = interface(IUnknown) `) A; m S: I9 g% y& z N
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
8 x9 k$ S4 c/ | - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;+ e2 m4 G& R9 l k
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;2 |2 n/ ^2 d1 Z. `. [* t) I
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
; j0 d5 J/ w, d - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
" V* n* Y8 T& B5 u4 \' P8 f - end;. I' _$ U8 X2 e" [2 p
- & j8 W. |, s1 {! I' E h+ s* A) o. \) R
- implementation5 ^) C8 D, H4 \! q: R/ g
- end.
$ g" s+ B( O* o% X
6 x& d0 \: S' ^$ W! v% O- Thanks & Reagrds,
. s' A6 J: C6 H. Q, z. Q1 S9 w% Q - Mukta ...
X2 j5 L" @, G8 `8 @) [4 P. ]
复制代码
& l! U* s( V! t$ x& P* U- it's work in Delphi 7
2 T$ ?& u* z; Q8 g; x8 z' u - //////////////////////////( q* V+ t! p8 Q0 e
- 1 L9 h8 O# y) ^' A" c
- unit MMDevApi;% N0 r# M/ p9 D! \" Y
- : h! Y- x/ i, v9 y. A
- interface5 x& H1 I' I' B, K1 H
0 B& Y; T) y$ m- uses
" ]% t# n6 @$ {! y5 N: Q5 h - Windows, ActiveX, ComObj;2 @# S) }# g- \, T( q/ A' l
, x0 z) A+ Y6 |' F' ]& Q( F- const
! j5 ]( _# F5 k0 O3 E- y - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';( d- V$ E# f1 @ p, v
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
' Q7 S# ^/ [5 D3 G( z - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
* u- x L2 l ~" N6 A: B: [- t - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
) q* f- b* W7 k! J9 M- k# O' i - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
G$ M) c9 H% M - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';8 s O2 K# t9 i! i l& P
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';4 B: G4 W9 L$ A3 l: S
- - Z: F, `+ j+ I& S2 H* S' t
- DEVICE_STATE_ACTIVE = $00000001;
+ ]. o Z0 L; _- Q1 D. r% x) _$ V. x: c - DEVICE_STATE_UNPLUGGED = $00000002;
) q% P4 X; a% p) P8 i. S - DEVICE_STATE_NOTPRESENT = $00000004;
6 q- K" D0 H' Y - DEVICE_STATEMASK_ALL = $00000007;8 \1 {4 c+ u2 l) }' w3 u
- / s1 T' t, \4 y* M/ i3 l! j2 G
- type
# ~+ x* O, @1 M( k8 | - EDataFlow = TOleEnum;
- s7 D% d: T& R$ B- y5 l3 @ - ' \' f; m8 H/ E! P: C4 u: T/ m* Q
- const
0 t6 n0 q2 J9 m - eRender = $00000000;! G5 Q$ I3 N8 L* Q# ~1 X
- eCapture = $00000001;
, O, h: ~! }& N) c$ w( `$ e - eAll = $00000002;8 o P8 I z9 w% M* Z
- EDataFlow_enum_count = $00000003;
; N- m) Q" {1 M) A' X7 u: f
$ b7 l2 j* j2 L+ R2 I) U- type5 P- ~8 B4 _6 |# D8 i, v
- ERole = TOleEnum;
3 Y% A7 X, _5 [( ?7 A8 P$ a - ; C) X/ S y ~0 D
- const
, V% {8 c. V6 o) o/ i - eConsole = $00000000;
9 w, A' G* N/ l& q4 M1 u - eMultimedia = $00000001;
1 \- ?! M. ]$ ~) \+ l P - eCommunications = $00000002;( Q7 W- w$ s+ I. c
- ERole_enum_count = $00000003;/ a& v; f) g# {' g
- ) l8 N# m( a! T9 J* w% B
- type
. {/ f. x& \8 a: }* |; P4 d - IAudioEndpointVolumeCallback = interface(IUnknown). K0 w; @8 ~" @- j0 }: u. [
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
7 n# |/ z7 O& g - end;
) }3 i+ e% ^7 s1 P; A - / ~( D) U3 E9 `6 i7 b7 z* q, W- o S
- IAudioEndpointVolume = interface(IUnknown)7 x Z- n" o2 X- Q6 S3 l, \
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']6 Y1 I! U' r( o; L" E" Q
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
( f+ h& p/ M5 U: T - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;) ^" O( s( S# U5 r3 Z1 L" [
- function GetChannelCount(out PInteger): Integer; stdcall;
! @2 [. X6 T- E/ s# \1 m - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
2 Y1 L5 x3 U A' {* G+ C - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;% [' _3 `$ X2 g" b: {& q6 [/ G) B, w
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
6 h; m7 B- L. O3 a - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
5 A, e4 o- g8 W* K4 n- X, X - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
4 C/ G5 ~9 J, J: U - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;+ ^. k6 C+ U" `% z$ W
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
@ Y- P! i4 o8 ?8 t - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;' p3 Y) u( m4 N5 l
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
7 }7 Q2 E5 c) p - function GetMute(out bMute: Boolean): Integer; stdcall;) R3 L/ |; z( g L! z+ o! ]6 y
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
; V: H8 W- ^7 I# X- M) X - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;9 K+ t! A' c, @# v9 G" _, r
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
/ I4 {3 p6 H# a9 A' T - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
3 ^/ g9 |' h: j6 C0 w# k - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall; N M5 W: A0 o
- end;$ m' k4 w- n3 X8 \. T
S. m- ~3 u7 R" t- ]) g* `- IAudioMeterInformation = interface(IUnknown)
6 y3 B& ^; x2 |! |5 H2 o$ J H - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
% v( R6 m) L" n, l, w" Y - end;
* A' ?, k# A; X - / Y; V" `; P6 X
- IPropertyStore = interface(IUnknown)
! X' R, k# o; W, {# O( ^' o( K' _. | - end;% ]. T4 Z* X2 X- p4 I
- 5 j: x0 L! R6 u2 k
- IMMDevice = interface(IUnknown)
; y3 G' a& V, y7 _0 ^# f* c+ W, [ - ['{D666063F-1587-4E43-81F1-B948E807363F}']0 |8 t9 _ S0 v) _' B" |1 z( c- f4 u
- function Activate(const refId: TGUID;$ [$ C, W8 g5 M: _1 B V9 J
- dwClsCtx: DWORD;7 s& i0 h. {7 j" h0 { c' A; E
- pActivationParams: PInteger;
0 l& |0 s6 W* u9 s* ^6 q# c6 \ - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;. U( `& N& O8 P8 f* Y
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;' Q! O0 x! \6 r' N; Q' W
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
; @, H3 v# L5 H$ B& k: H! r - function GetState(out State: Integer): Hresult; stdcall;
3 }& {, z' ~+ p5 }: |* H# j! o0 | - end;% N3 Q9 T2 ~* r$ b4 F/ c. r" V
- $ b2 F3 L; B" D, v
- : V3 d5 n$ a& M/ m7 B
- IMMDeviceCollection = interface(IUnknown)' c# y; F0 T9 E+ ]8 @0 T4 \
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']. }' _( h) {, C3 e: k
- end;4 W8 W- y9 A/ b2 n" ?! {! T* ]
- * d5 T q5 ?. A2 V$ Y+ q* R7 T- S
- IMMNotificationClient = interface(IUnknown): M* V+ Z5 Z$ t! [4 W6 W, B
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']4 S$ D ]. Y: d- z& L s# f7 j
- end;4 |! a9 h/ [. c7 @# O- W
+ [3 X2 w6 U M3 ~7 i. z- IMMDeviceEnumerator = interface(IUnknown)6 C4 `4 P/ P7 \ M$ z/ H
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}'] i9 |# K" L6 V# N9 L6 k3 |
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
5 V) ?5 X6 G) s Z! N - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
1 {9 M4 y! J0 h+ W1 d - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
" F" v$ Q- g0 h5 a - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;/ s8 B/ S" \: I8 c2 Y) s
- end;: f1 N" ?; z& t; B2 E6 x
8 ?$ i" V# ~# I8 [% W6 g3 S- implementation
" _) L; `3 r/ O! S- y0 l
; N8 e& ^* t: I/ m0 e; e" s' ^- end., F5 T/ x4 w- c6 D2 H, f8 y# f
. G! K. B& Y" O9 g: X1 N [- ///////////////////////$ p: l7 G" U) Y8 z/ I
- simple sample :)$ C$ B7 R5 b. N+ }* |4 Z
- ///////////////////////
/ t* z# g; Y; B3 u( [
& `) u0 }# f: _+ d- //...... other code6 G2 F4 s' w/ q( d
3 r8 M; K3 `# D6 F {! `% ~+ z- uses ... ActiveX, MMDevApi, ...;. }- y, G' }3 \- T
" T% y+ F7 Y. D; h9 ~- //...... other code" f! W% X$ O8 m8 c: O
- 6 W* k2 M) D9 J' n0 s
- var
7 d# w, k. T( Z* L" ?8 Q% x - endpointVolume: IAudioEndpointVolume = nil;# N' k0 K' [* n: I3 e$ _
- ' g5 g( p0 I) G) ~4 r( S' \1 K
- procedure TForm1.FormCreate(Sender: TObject);3 }( g8 w0 B3 _/ w# L
- var
* ]% l, S& z$ @6 h" T/ B - deviceEnumerator: IMMDeviceEnumerator;
5 H! \# [2 |9 J$ \* ^ - defaultDevice: IMMDevice;
: V& t$ T- ?/ d% z e/ a - begin0 Z0 w1 S9 Q1 N8 K9 W- ?
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
9 i' v7 K S$ n& t4 | A - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);2 ]* I. |) G: A
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);5 a4 J; i( {, g; Z8 |
- end;; e* @. c: [: ?
- W$ z( L/ V$ K& y: i% U
- procedure TForm1.Button1Click(Sender: TObject);3 J2 k/ g+ n5 c: \
- var
# |, r6 ?+ O# y% e# d. B - VolumeLevel: Single;! }2 _4 f, G6 C0 F, Y" `8 m
- begin
E# E: x2 }! I% S& J( B: K - if endpointVolume = nil then Exit;
M3 w3 k* e+ e! l) ^3 D - VolumeLevel := 0.50;
. c7 ?+ Q! Y3 w% q - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
; U0 ~5 t, k- L$ V4 l - Caption := Format('%1.8f', [VolumeLevel])! }: W$ p1 f5 R
- end;9 |5 x, ? {% ^" p ^. \, x; Z" y9 G' j
o2 T, x+ u- g5 R- Y% I- /////////////////////////////////////
* l& E$ e( }& q' S0 i - : f; ]0 J- H2 H/ V
- // with best regards ToxicDream
, O' X" N& M: @
复制代码 |
|