|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
* ^4 _3 S* X8 `5 }( u. mBy Mukta & ToxicDream
6 c" G D. h. v- //for delphi 5, r# k; h/ L, Y5 C' x
- unit MMDevApi_tlb;' M+ h0 M$ c+ J7 }# M
- ) p, n8 C! V) X( t( e% Y& B3 q
- interface
5 a7 \& ^% a1 p, C' m - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
3 A7 Y, p6 n2 [& c1 M% w - const; v# X: ]+ ?" R2 N4 e' r
- // TypeLibrary Major and minor versions
_4 Q H ~2 [, @6 v8 s/ [ - ( j) y) Y8 d5 J! x. X* s
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';- l% v, ^: q/ p6 ?, r: W! P& u$ p
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
" R4 G: ]. x# A% a3 r$ C0 i; d - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
0 b% D- n! E8 J4 n - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';3 E, F) H; f+ r2 E
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
% l' c1 ]# v0 G0 ~. f - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';& R2 H& n8 B0 D( V
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';" F+ |- F; F" g
; r. ^- u& J/ k" C1 a M7 S- DEVICE_STATE_ACTIVE = $00000001;+ g* v0 O. O& {
- DEVICE_STATE_UNPLUGGED = $00000002;
7 g0 f( P% v3 s* H - DEVICE_STATE_NOTPRESENT = $00000004;# B& N. O: O x/ P0 ?
- DEVICE_STATEMASK_ALL = $00000007;: h2 @3 |4 z3 v4 m
- 7 T* f% R `6 e9 a8 O7 m4 W
- type- Y: r0 [% f+ ^& s: f6 `
- EDataFlow = TOleEnum;
" g9 e, s: C0 \$ { - const$ I$ y, D* c \: `" o2 n3 B
- eRender = $00000000;5 W5 P: L1 s1 Y# B T
- eCapture = $00000001; d9 k) w) E; y3 E4 u' B4 P( m
- eAll = $00000002;5 A9 D. I) F% r) P
- EDataFlow_enum_count = $00000003;
8 q! H9 l/ \& p1 ]* Q& V - , {- c H5 ^) v: U V0 n
- type
/ z' H& C. L/ H1 q" @( n+ G% k7 P# ~ - ERole = TOleEnum;
8 J. q: P- p: H. L+ z - const. ?. {1 n' |1 a8 F* I/ _: D ]
- eConsole = $00000000;5 s: ?& c* U% P* g2 y$ }7 [0 o4 Y! j
- eMultimedia = $00000001;
! L4 Q, D V5 s$ t+ p. u - eCommunications = $00000002;
+ V3 L" M0 D- e. U L3 Q( o' e - ERole_enum_count = $00000003;2 y' T3 y2 A7 p8 {) T* o$ G" u
- : K* h; o6 t& `' O
- type
; v1 A7 a. H! \: V6 S - IAudioEndpointVolumeCallback = interface(IUnknown)
4 w* v% V3 _0 G& D' { - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']2 F& l$ H4 F! b% I! y1 q+ p9 }
- end;/ ]6 s3 ^( f/ T! Q" o- e
- 6 e. e5 ?8 h' L2 K6 x0 {
- IMMAudioEndpointVolume = interface(IUnknown)
2 J; f n1 F' \2 Y; v" D4 n/ U, y# k - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']+ v+ t s2 M D5 h& e
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
1 m: {1 v* {% x' @9 R- ~4 ^. ` - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
/ w0 M. [0 T: O' Q3 k - Function GetChannelCount(out PInteger): Integer; stdcall;
0 `: F- A! l6 s& [) ]# P3 D - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
; d& f2 o; t% t; i - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;* } |' z* d1 z$ i$ l
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;3 p4 O: c0 A# O0 r
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
; r( L+ B1 z4 _) K* G - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
% u# F5 I/ E; \% G0 z7 U - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;, z- C& e8 c! B( U1 l% K1 ]& a1 q
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;7 l5 b; ~, a3 }. v% K
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;9 e/ X$ C" g4 J3 u
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;1 _ i) g. y+ C* l4 Z
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;
9 Q& Z9 t w! B# P - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;1 o, ?3 c! z& _0 t) l
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;- g. I8 C1 z2 k9 g* Z2 } P" b, K( _
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;& N8 [( k7 H# X" f. r
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
; |7 y4 m3 g& l4 J5 { - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;. P, @+ n7 d* a9 {# x
- end;3 M/ r- q" s2 e/ Z; q
- # X! Y1 }( K4 Y h& S' s- J$ k# @" J
- { IAudioMeterInformation = interface(IUnknown)& b( U' D6 z9 p: H
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']# n% Q; K$ s+ e3 c) r5 F7 k
- end;}* F+ C' u. _3 B2 \; U
7 p [: M2 y) G+ r3 g- IPropertyStore = interface(IUnknown)& q4 S* P' @) W; A+ l/ ^- ]
- end;# W5 s( a2 Z5 l5 x; V
- 3 [5 m4 X" q! z+ f
- type
7 g, L: T9 t8 t. N& n$ M" ~! O - IMMDevice = interface(IUnknown)
A/ m0 o8 G: w - ['{D666063F-1587-4E43-81F1-B948E807363F}']+ c& ]& W+ V* Y3 Z! g/ F% `) b! b
- Function Activate( refId :TGUID;
9 O' M. H- g9 R9 s. n' O. s' u - dwClsCtx: DWORD;- ]( G9 w# Z6 j: \
- pActivationParams: PInteger ;
F% w5 _( f2 G( ^5 s8 B% @ - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
* D: G3 e4 @& C# O1 S5 Z - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
; [: h6 j! j x% A% G - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;) Y% b* p8 U7 v% ~2 R& |
- Function GetState(out State :Integer): Hresult; stdcall;
0 l+ `( ]! w+ X, z3 j
& \) E8 a! @" A5 R) }+ X9 \- end;7 L5 `9 V4 e; n" q. X6 P5 O8 o7 u: ]
2 L: d. ]5 o% L( m2 q
- f# A# k3 x P3 p# v" y- IMMDeviceCollection = interface(IUnknown)
$ J! \1 Y" ?7 w/ e; W - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
5 _( E. V5 @/ p. r - end;/ F3 n5 j$ _% b6 a
- |; U1 S- I M: Y0 i. F- IMMNotificationClient = interface (IUnknown)' L. h) o6 `2 T. m3 z" @. d
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
. f: R" [% h3 @* a, G' j( ] - end;
+ n# d, K* Y" h: K - ( y2 p0 p+ u2 G9 `: x
- IMMDeviceEnumerator = interface(IUnknown)( }( N: X; H% {3 w
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
0 V( P* h$ L n+ c3 }% x - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
% T* k& Y8 T! s, y, }; L - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;6 i" P) Y0 t. M
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;2 J c, j* k" m. _5 m1 u! `
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;8 [! y; \% }. \5 J; l
- end;
! E! k0 i2 _4 P" c1 C# l
" J5 i! L7 g7 j' K1 u2 c9 r- implementation
6 U. a* k. q" `: I6 ~ - end./ c# M% S$ U2 p5 w
- ! S7 s% _% G4 v" o
- Thanks & Reagrds,! l! s; z& I" a& i
- Mukta ...
& G" j$ k Z) j4 |5 R
复制代码
# U9 R% K) J: }: a: Y' N. X5 ^- it's work in Delphi 7- n5 z6 l6 R3 T$ X3 b
- //////////////////////////
! v/ Z* j" y6 C5 z+ b
" w c# E" G" I y- unit MMDevApi;
! t8 F: f3 a+ Y
0 I; `6 o5 A, y: |6 j' I- interface4 q- D3 i" J6 i1 {. O# Z
6 B w# ^6 I) z6 a1 c- uses4 [8 E* F4 _, D+ k
- Windows, ActiveX, ComObj;
: ~) [2 W7 P% f A" |; z) w - & j# y6 G6 l: h: W5 B) Y
- const
V. g' r' s) | i0 i9 J - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';9 r: i& ?& j: N
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';: {4 `2 i1 C4 w1 }9 t$ w
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';4 `, g `! j% o
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';" r2 c# ~2 V% l" ]8 K1 Z3 n
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';. q: S, a/ e6 h$ a: \* ?4 C
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
$ K% D4 s( G( Q - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
! ~2 p k( [8 b" n - ' G, N9 {% i$ o8 T1 m: g$ X7 i
- DEVICE_STATE_ACTIVE = $00000001;' M' W; w/ K$ k3 `3 D$ W
- DEVICE_STATE_UNPLUGGED = $00000002;
* {4 v5 N# {' n, S3 | - DEVICE_STATE_NOTPRESENT = $00000004;
6 ]- {6 C6 T* F3 d+ W, i - DEVICE_STATEMASK_ALL = $00000007;
/ S# X' ^; D, I( [- P
' x: I1 H+ y- r" I! D- type
7 x' P+ I) g( ~2 c( H) Q: C - EDataFlow = TOleEnum;
3 A5 v( h k0 |3 `3 S6 ^3 }+ @
- t5 ?; |- v, S9 t- const
) i' N& r9 X9 |& d8 L9 C3 ?! [% A2 | - eRender = $00000000;7 m2 }! x" O/ X& J+ L* n# v
- eCapture = $00000001;
2 K$ @3 t6 T5 h5 e9 x - eAll = $00000002;- T: g3 ?0 x. d' F
- EDataFlow_enum_count = $00000003;
: ^/ v, U8 t( M- D! B b7 ~1 t
, {- j; C) \/ A x% ~- type9 ?1 y- Q) g7 i/ K* K$ f8 m. d
- ERole = TOleEnum;
5 [& |( k1 T7 f/ Q5 t/ U* {+ E2 J - 9 v; O, X% s: t# L1 P2 |7 M
- const, N5 s/ T& ?4 R% i+ T6 \7 _/ f5 F
- eConsole = $00000000;+ b% k1 O/ c7 _; U$ |* S( B5 i
- eMultimedia = $00000001;
* Y" ~4 q% D* P/ D4 O) f8 v3 a, q - eCommunications = $00000002;
4 ?5 y7 S, M; E0 w& n J+ Z! ^ - ERole_enum_count = $00000003;
/ k/ t- H! H% t1 m. B! W
2 P* n5 |5 q4 k+ C4 W' Y! b- type
5 p) a$ D. A7 b [2 K: w8 c - IAudioEndpointVolumeCallback = interface(IUnknown)
2 _, P6 I5 M( n/ v# r! f1 b - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
% N. u, a& L% @ - end;
, B9 a8 ?* Z5 _; f* h - 6 {1 L! i O$ H- v+ k% C$ w" `1 i& V
- IAudioEndpointVolume = interface(IUnknown), z& r* S, g# g5 A
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
9 p3 z* X9 S5 F+ ?/ Z - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
0 p7 V* _- f9 P2 } - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
5 B U: d$ u: s& N9 Z - function GetChannelCount(out PInteger): Integer; stdcall;* ~( c0 K Y4 X
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;' e5 P8 R( c2 _. B d/ ?0 G
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
1 {# C: w1 H) c! a& K) G - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
8 d! m. w, c- ?1 K2 ]& I$ ?6 } - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;, x* }! K6 P/ n+ R6 R: n
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;* x T# }' M5 B2 Q, r
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;8 x( d& u5 H, \; u
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
W; [# {7 M# C - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
$ Z: g+ z4 S. A7 k - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;5 H( [/ N2 e$ ?1 |% q% ~' y' f% M
- function GetMute(out bMute: Boolean): Integer; stdcall;
$ @8 Q0 o2 h3 j& X" d$ {" a- } - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;% m& j4 z+ j* T2 a8 y) l9 Z
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;2 H! L# s5 l# l
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
; E, y2 `6 B- j$ [: C7 x/ ` - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;' Z& X% X8 D" |( A( m
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;8 Y3 z- N3 ]6 Q+ d. ]
- end;
) O4 K! B9 [7 R5 n - 3 a$ w9 I4 l3 H. M# {/ P' j( O
- IAudioMeterInformation = interface(IUnknown)) g; q% _ e1 K; }: D7 K# F8 M. _
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
+ p- K" h0 k4 C, D, Y! q - end;
Y9 d1 J. \/ R& W3 u, z7 D' k8 k
1 m+ j) {4 Z% \& u0 j T$ e- N4 C- IPropertyStore = interface(IUnknown)9 p2 c- C0 ?' T% v' k
- end;3 T2 X7 w; Y! |* y. p& O
- # I0 K5 q# U8 @- f5 u# h
- IMMDevice = interface(IUnknown)* p! y2 m! z1 x1 l* p5 `1 s9 a
- ['{D666063F-1587-4E43-81F1-B948E807363F}']$ \8 R6 s7 O5 }
- function Activate(const refId: TGUID;
$ K8 c( a( ]1 R2 y" m4 s - dwClsCtx: DWORD;" \" S- V2 j) @; k$ P" ^4 X7 B+ K
- pActivationParams: PInteger;, d; Y/ K* E' Z6 J8 Q
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
) d M9 i; F+ k+ U# O' G; M - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
$ Y1 x8 ~/ ]8 M& B) Q - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;% f! F+ Z: H7 ^( g& A- B
- function GetState(out State: Integer): Hresult; stdcall;; [$ X1 T2 m$ h8 B# q& h+ t' N0 X
- end;
; D6 l( N) g) f! M/ J/ S. f( _
& E! ^5 T- a0 \: m& w
# M$ v" @& w) L( F! c; ^4 h- IMMDeviceCollection = interface(IUnknown)
1 p$ G6 @8 f* |6 x# w* f - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']$ F. C' D6 y, b; W u, e# Q( P
- end;: ?' W$ p, J) g* G3 C
- 5 b1 m: }- ?2 l* v7 A
- IMMNotificationClient = interface(IUnknown)' X' V% G, ?2 {) e, l' I
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
$ R& D6 A6 n0 ~& v$ U C - end;
( ]+ X: R" B* v
. v( _4 R3 e+ z% q6 l1 E. i- IMMDeviceEnumerator = interface(IUnknown)
+ h% k6 c* z, r3 N6 }/ ] - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']8 X" g( G6 X& @( q
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
6 s6 k* ~4 o7 y0 ^/ z. \* Q - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;- o6 U0 s' ^/ K* ~
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;" {# l- w% j: K2 H
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;& M7 ~$ e% u: x0 t3 C R: ^
- end;5 S) A! |0 L/ f S
- 8 ^0 @! z* c4 ?, t8 r) J
- implementation& j9 i" h" Q+ ]. b, z4 u
0 C0 i- D: p/ g- end.
+ I9 e0 Y. j4 h& Y3 Z1 [; Y7 E" R - 9 y3 N4 u) B# X5 N
- ///////////////////////4 l, |+ j0 ~+ v8 n8 A
- simple sample :); o: E4 l% `6 k& }
- ///////////////////////2 W9 Z3 D+ g8 d$ m6 F7 J: W2 d
4 N2 {* W& Z; c- f2 K( T' i+ N: i- //...... other code/ s# {1 I* T3 |% \
- 6 v6 ]- O. S7 H( }
- uses ... ActiveX, MMDevApi, ...;" Y0 w6 W' u& P/ x8 ~% H c
- - B/ w) {& T& ]7 S$ P" @
- //...... other code% b2 W$ I, ?$ B9 @0 f
- . ]) Z$ u! N. ? z) J, k
- var1 ?7 |! Y8 {1 N' k9 a4 W7 F" \; G8 T
- endpointVolume: IAudioEndpointVolume = nil;
2 v0 B5 u. q; {! E! u6 t! Q; M5 |
; _+ U+ g. }4 i7 I* O+ t- procedure TForm1.FormCreate(Sender: TObject);4 I g. I. S$ N/ _" C
- var
/ ]4 m0 v7 {% j7 h) ?; T4 S - deviceEnumerator: IMMDeviceEnumerator;- G# r, `% Y$ G% {) v
- defaultDevice: IMMDevice;
* b+ h6 H0 B' s( T3 ~ p: G$ ^; E) C - begin
_( A! W( L# W+ H# q' r$ j - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
& T, m; x8 b/ W9 G' C - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);9 D2 C+ _8 C4 O! ?+ G9 j' z% Z
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
9 u, z7 t$ e3 H7 u/ Q% I - end;. v$ _( d2 P' x i, V6 v) w
) z+ |* l. d7 J1 o+ _- procedure TForm1.Button1Click(Sender: TObject);
0 F( A1 c0 d6 v F8 s - var
( E6 p% O7 H+ x! d - VolumeLevel: Single;% y3 f' Y1 t; T+ g+ n
- begin5 Z. n U# A5 g* f7 r
- if endpointVolume = nil then Exit;7 G0 p/ O. X' X) m, e& g5 B
- VolumeLevel := 0.50;
/ T0 P0 D( \( @& t9 V - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
0 e& f% R/ ^ _" j - Caption := Format('%1.8f', [VolumeLevel])4 h i" V. F. B$ e1 k
- end;
) s/ a' `2 r. I$ G6 ^! `6 ]% V' z
: M$ A7 G8 F# ]) j. W- /////////////////////////////////////3 D6 F9 O `+ Z: Z
) }) m& I0 K8 a1 W* P& y: U- // with best regards ToxicDream
; g7 C* K7 k5 \7 p1 k/ E& v" |2 t
复制代码 |
|