|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0582 O l" B9 d% q/ U9 b/ d
By Mukta & ToxicDream
6 G. D y/ n6 G" j' {- //for delphi 5' `8 f5 I6 A7 G% I/ D: ~1 [
- unit MMDevApi_tlb;
2 e" b6 U9 W. s - 8 }# t, i& Y& @& z
- interface3 ^, n8 H4 u) g% u) y+ Y5 |% g
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
- H1 \! R2 z. a# s, B/ ~" U; j5 d' d: o2 r - const
0 Z+ R' t- w" P# Y- [ - // TypeLibrary Major and minor versions
! Q. k5 a, M3 P: u' X - $ ?" h% Z% H% z' R1 T
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
1 |0 Z) Q0 s* R, p& ~1 ~( w$ m - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';+ D( _) i" |) @( Y
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';8 S M$ S. x: C9 X, w
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';2 [& s+ G9 o! S( a0 }5 X& p
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';+ P. z3 J4 g- ?
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';- |& Q& i# i/ ]% {) B. E0 Z
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
+ E1 s/ P! w* q- s - : x! Y: o& v* k3 F! ?) k% j! G
- DEVICE_STATE_ACTIVE = $00000001;
2 P, @+ p! L2 J& T: m+ y - DEVICE_STATE_UNPLUGGED = $00000002;' r. _& S# j# ? {# a
- DEVICE_STATE_NOTPRESENT = $00000004;! L# U0 c \' E* R% R
- DEVICE_STATEMASK_ALL = $00000007;
! N/ \. e; `$ {0 | ~. o - * I8 H6 c% `! E: D- ~! w
- type' I; m4 H2 e! ]
- EDataFlow = TOleEnum;
* n7 w$ Q5 G3 x7 a, D! W8 Y - const/ A; a" [: j L/ }& V& S: B. H; ?
- eRender = $00000000;
# e0 R. g7 k+ d& K! L) a - eCapture = $00000001;
$ E. S" h* r4 O! c6 | - eAll = $00000002;6 }" v8 g3 |8 n4 H( s3 k0 y
- EDataFlow_enum_count = $00000003;
; g& P% `9 J; V. e, W$ C - % s9 D: }, k7 V: F$ a& z- w
- type* { r* L/ o3 ^6 T/ I$ ^% e% ]
- ERole = TOleEnum;
, L# K/ M, b: c% f& [ - const4 ^$ D0 D: M0 e
- eConsole = $00000000;+ V- R" m# w0 b4 e) f% |0 r; L
- eMultimedia = $00000001;; [6 q, }& S3 J
- eCommunications = $00000002;4 u4 K: V! e, B! e4 a" _% Y
- ERole_enum_count = $00000003;2 T- Z5 L" d1 g* ?$ | ?
- " A `1 f; `/ x
- type
. Q8 O M- @6 ~! d+ t: P6 h - IAudioEndpointVolumeCallback = interface(IUnknown): a2 {; ?1 n' ^* n
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
, u" e) }/ a$ G; Y' F/ ` - end;
$ m5 z3 Z. v# u9 N& N: h$ ~ - 1 ]% Y6 I0 u# K1 D0 E$ q T* Q
- IMMAudioEndpointVolume = interface(IUnknown)6 i L9 u$ k: ~% `
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']* ^# J! b) j" S2 i6 [- h/ {1 L
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
- i. x; N% G9 w! y- R/ M" }" Y$ Z - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;$ n& |. H' H6 v) L% A' f+ X. T
- Function GetChannelCount(out PInteger): Integer; stdcall;# q3 p- y3 ` n/ v
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
" o/ E' V! L" |& q: ~ - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;/ X9 @- k- e7 P9 {$ k, T9 P
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
) j' c! S( q$ @ - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;* m- l2 }% t! k9 s
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;) ?. k+ |8 J# L* F+ \/ V
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
& A2 q: b/ r& b, k4 p) X8 g$ } - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;+ x% t- Z- }' B; x/ G' Q& |) m
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;9 p0 H4 o& M% Q7 Z; w
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
/ I3 n' ^* `0 g# d/ w$ Y0 Z - Function GetMute(out bMute: Boolean ) :Integer; stdcall;1 M$ Q4 ?8 j3 ]
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
" a% z; ^8 {/ r - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
3 B; a$ \, Q4 a+ N+ `, X - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;3 W9 \1 Q3 u& Q: T6 z
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
% ^; X. @& I- }2 ?5 `/ \ - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
: p3 d- u9 \2 r$ B2 S2 B+ e - end;
! G0 ^3 Y) l* l0 I% z: i - : P: v0 z- M8 N# U
- { IAudioMeterInformation = interface(IUnknown)
; V n% A2 \4 }" U, ]/ A# d& J1 w - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
% f; t* e( S9 k1 m2 W( b& ] - end;}5 X* l, ~7 V1 x. w, `
- - n* c' p+ S& g/ f% y$ C+ _
- IPropertyStore = interface(IUnknown)
4 Q) O4 y* v, `" X z - end;
, M& b% L- _+ r# c
2 F: f' z0 A0 r1 Y3 Q e- type
; \% H9 r) K2 H0 `4 G" _. M: r. i - IMMDevice = interface(IUnknown)) L$ b: Z9 ]5 W a, q7 H
- ['{D666063F-1587-4E43-81F1-B948E807363F}']" {" j6 W) D \: w7 P" r0 i6 w+ [& }
- Function Activate( refId :TGUID;6 f& T, i' ?8 @7 L* ~& n* u) d
- dwClsCtx: DWORD;7 q- s" x" J" M+ N
- pActivationParams: PInteger ;
" A+ z8 {! W8 {0 t- a - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;& y m7 F) l2 S
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;7 ?7 l# y# H, y& q! W6 G* s
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;" ?4 u' _! g, t6 m9 w3 ?
- Function GetState(out State :Integer): Hresult; stdcall;
* D' x& i! m8 |
% f- p, ~3 X: m d8 ^6 D* m- end;
* {5 _# Z* `- @/ E
+ ?' F9 o8 h6 L" M+ M
4 W* q) b; T/ r- IMMDeviceCollection = interface(IUnknown)
( Z F# L. [# [1 {! P6 } - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
$ L, [+ }& N) [& z - end;; Q9 k+ R7 m0 }% I* T/ Z
# a3 ?: J' g+ f) q, {! ]- IMMNotificationClient = interface (IUnknown)* r- p7 |6 N9 t2 L, X( g
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']* G( q5 h* T6 h$ Z. f1 n
- end;
2 S, s5 s/ F8 v. d: K1 W
& Q; G, O/ ]& v' b- IMMDeviceEnumerator = interface(IUnknown)
/ V4 Q: Z4 l2 b - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
; ~( r L5 r5 S4 a2 H - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
! u$ B Y1 Z; \7 d4 V9 ? - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
2 ` Z7 D+ S* Y! O7 r* [; E- V; _8 g - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
# {& {" H3 W: V2 o7 @$ Z - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;* \- G8 X% K4 S
- end; I4 R( x0 |1 J& f- ^
3 D% y2 F2 z0 M+ H) D# X- implementation9 I+ _7 [, z! [# n+ K! p
- end.1 q6 O; I. i! o' H( R
, g) p3 [* s* \, E1 j) Z- Thanks & Reagrds,
5 s" b5 o: U5 L# g) ~ - Mukta ...
# G3 p* l {' b# {' ^' g% L
复制代码
. T2 E3 I* T7 e7 ^- it's work in Delphi 7
/ T7 Z1 x: L, Z8 g - //////////////////////////
2 t, A2 X ^+ M% ~; U. m/ [* X& ~5 N4 A
3 z( T- Q. M% d) g& m7 f- unit MMDevApi;4 ^9 g: K8 O2 R% v* Y
+ L2 T1 k1 ]4 Q( P4 z. ?- interface
9 t. ?& T8 l/ Y: I& K. w* W9 f# X - 3 l( S2 L9 b. K1 l" t c
- uses
+ M V$ i; i) O% w) w p- f2 t - Windows, ActiveX, ComObj;: Z) B7 s9 H" v0 j9 P3 B( R1 @
- N& `* M, W6 C8 _( ?1 N& v
- const9 t4 I1 @, m; o. c: D$ l: }
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';4 D7 x3 [9 U4 ~9 S* `% U
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
k `' T+ E* j - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';0 u% y+ ]7 p2 g# z/ B; A
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';6 }3 q( }4 `5 i, I) l
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';/ G v- X- j/ x- o$ N
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
6 h- g6 a* I! \ Q& t - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
6 |# c8 Z' z G( g1 H
$ t' ]3 P- T: z: u* L8 p* |' U- DEVICE_STATE_ACTIVE = $00000001;
; w* ~( i- }: @3 @ - DEVICE_STATE_UNPLUGGED = $00000002;2 z$ t; u( f) ~& q% r. c) O
- DEVICE_STATE_NOTPRESENT = $00000004;! A" _# ^: p v$ X, ^
- DEVICE_STATEMASK_ALL = $00000007;( r' i0 e' s+ A- b# K5 X. K+ ^3 l
, z6 `, ?& |' \2 _) ?- type/ g: W- r/ d" C! r! u/ F* g
- EDataFlow = TOleEnum; |7 A% z) |* U; f+ {8 s
- 8 A1 _, I9 Z' u) ?$ s' H" e) ^
- const1 ~; S1 b9 B% i- T4 ^4 O
- eRender = $00000000;
5 s P+ ]+ O. R I - eCapture = $00000001;
% D5 ^3 @7 [: |" o2 S" p, b4 E8 i5 H - eAll = $00000002;
$ O6 g# x9 y8 B' Q. f5 r6 L! t - EDataFlow_enum_count = $00000003;
$ w) _5 y# Q" h$ p1 U4 g' h' ~ - $ ]" b* E/ m5 F9 Q
- type( ~9 |7 z1 {/ J& o
- ERole = TOleEnum;
9 N+ p9 a# b7 X+ T3 s - 7 L$ l8 j' n- k2 [/ v# q
- const: {9 A5 e) |. v9 ?. ^
- eConsole = $00000000;
& n1 N- P1 k( M8 e6 V$ s - eMultimedia = $00000001;& s% ^6 b2 \# N4 a- s. a' Z1 m
- eCommunications = $00000002;: _% W' [" c# T9 t. V4 F
- ERole_enum_count = $00000003;
' _$ ^% {& ^1 n$ v" A# b - 3 Q1 H+ Q& q, N- w
- type
0 H1 q3 V" B/ E" U! E6 d - IAudioEndpointVolumeCallback = interface(IUnknown)
% G m; h4 F# D2 i& f - ['{657804FA-D6AD-4496-8A60-352752AF4F89}'] ~5 ]5 ^; l x' f
- end;
7 N4 g3 a x4 d' ~! j: f$ |. e, G
! `8 S, ?% i8 U9 S& Y- IAudioEndpointVolume = interface(IUnknown)
, j2 m6 ^+ f+ R5 Y4 P$ A" h" h - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
# M3 F4 j0 a! i# H5 }; F - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
' F% H- t) N% p/ r% F - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
5 [2 Q; I% {: h, d - function GetChannelCount(out PInteger): Integer; stdcall;
3 ? y: ^! m4 l/ f - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
% U$ a) w9 @2 \8 P( X - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;% y% c8 K9 [3 l
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
5 C0 M; X6 R! w - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
" D+ r" c# U0 t4 Y* c6 r - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
/ @4 M: n8 N7 P- Z; p - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;! s% @- b# r$ `' N- |6 S
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;5 r% c% X. y$ a$ a7 E% @. k
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;8 {. B4 \8 Z9 I, j6 Q: h
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;# ?: q+ q' {1 t
- function GetMute(out bMute: Boolean): Integer; stdcall;
4 I* J! h7 a4 r% }! ] - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;9 S f* v3 z; J5 [
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
M* _& B0 O8 o" h - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
/ c" h \& s$ }. i6 ?5 z; t) } - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
: ]4 y+ v' G+ h1 c - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
0 F' f) J! O" u" K0 u) h - end;# X- [$ a1 u/ y- a) W. n6 R
1 h+ u' u; o1 S! K+ c6 ]: ~- IAudioMeterInformation = interface(IUnknown)
2 m! @5 `4 J1 N* T" s. e+ L - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']0 W& J4 U8 Y0 U
- end;
# Z7 ? }' r- N
- W/ y# n3 N1 ~8 q- IPropertyStore = interface(IUnknown)5 z& p, |; N4 S5 |% [" D! q/ L, Q
- end;
, P- P$ n4 o2 {' ^ - ( F+ T1 y$ ?9 W+ C l
- IMMDevice = interface(IUnknown)1 G5 T4 `' _* P" C& N
- ['{D666063F-1587-4E43-81F1-B948E807363F}']* \7 s% T( `6 W: u
- function Activate(const refId: TGUID;
* b. X6 G: q+ H2 |# C3 R - dwClsCtx: DWORD;3 s7 h, x) l8 F- p8 n
- pActivationParams: PInteger;
9 E* s: H( W+ H5 u8 b7 G. Y4 b - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
% p0 F8 |$ `4 S/ e* I - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;& `3 r) I* e& e' `* V1 }
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
1 i! c4 K% V1 [: H2 r - function GetState(out State: Integer): Hresult; stdcall;
# e7 ?& ]1 ]0 l& @& f: H - end;
6 C, W1 c; B7 N# h$ a. x
( g0 w( x& @; x- R* K- . C+ O# c4 D4 @$ t% H
- IMMDeviceCollection = interface(IUnknown)
) _& J' D$ h6 |0 R9 c - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']+ Q E/ G* H" R& d3 T9 m/ A
- end; a2 x+ \5 `# _0 m0 c
0 Q( c; {6 _1 Q& c1 m, h" A- IMMNotificationClient = interface(IUnknown)
. W! T; d$ w- z, ]" @ E - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']) W6 F! ~% N. b# w
- end;( K+ F# L* s/ E! _
- * s8 H" i( U6 b+ E
- IMMDeviceEnumerator = interface(IUnknown)) k$ k9 M! d& A9 s3 Q
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']. Y0 U1 \9 }6 E2 P5 U* @$ b
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
/ E) j O( @$ v4 ^ - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;+ k; H2 A3 F w+ @2 G- t& u' ?
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;6 s6 v# u- e+ D7 F
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;+ O: m9 U9 e3 G$ e# ^4 k
- end;3 Y# a" X$ S( p
- ' U0 D4 m& T' M' i8 B9 R0 B
- implementation
% D* L5 L- d! @0 J4 j5 W9 O5 X; I2 Z+ c3 x - 7 u! e7 `5 j8 H$ o! B5 ]
- end.
$ m# ^: O/ b( I8 g) } - $ F* x5 E/ {! {- P/ F+ o. E& D' w
- ///////////////////////0 ~& A% H$ B6 P6 E) {
- simple sample :)
) E" S& ]' g6 C! ]7 ]: X( Z - ///////////////////////
# V: g1 D: @6 M1 T1 P
: b, [& f3 k3 F d" {2 |9 H- //...... other code
2 p3 `9 j& }, ~1 p
. S2 U3 d; J, _; ~7 [8 T$ x) w9 S- uses ... ActiveX, MMDevApi, ...;' ^3 Y7 c2 a5 c
T7 x9 v/ S! ^; p5 t8 X# H- //...... other code
4 h! K' `5 g4 }/ v
: D" F) X T* S$ U- I- var3 |& [8 a& e% ]1 g
- endpointVolume: IAudioEndpointVolume = nil;, w; w, C( o5 x! d. a
% y$ C$ F" C2 J- procedure TForm1.FormCreate(Sender: TObject);
% V% }6 [8 ^5 C, K2 U. } - var% \ g& z# o0 h+ o9 i8 k( c
- deviceEnumerator: IMMDeviceEnumerator;
% s1 |$ k9 U/ s, }* B - defaultDevice: IMMDevice;
; H' b) F' `, X6 f - begin
4 \, [4 Q7 f1 N- a ? - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
4 {) V+ U* D$ r$ p3 Y, C b3 f5 i - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);5 e* ?- Z7 z2 A0 ?) Z3 V/ s# {7 E
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
$ b& n' D: S' L( |+ U9 P# {' J - end;
5 ~3 K+ w) ^5 ?# C( m3 U6 ]3 o: D - 7 L8 E# W) c# `
- procedure TForm1.Button1Click(Sender: TObject);5 T9 [8 M: F% M
- var
4 |( H8 [$ P( V: A# l( O$ k - VolumeLevel: Single;
# l$ n7 d4 y$ V) m7 Q - begin# [# A$ ?9 d) x4 O b
- if endpointVolume = nil then Exit;3 Y# t' F/ H- N. @; X* A* {
- VolumeLevel := 0.50;1 `# f2 h& \) R% q8 @
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil); {" p/ |. C4 n7 E2 z8 i+ n6 v3 J
- Caption := Format('%1.8f', [VolumeLevel])- G9 W' X2 w7 g- i; O
- end;: p' R: {* I4 }# j: C$ m1 [* O/ J+ J
1 k$ [7 o {( P; ^5 f' L- /////////////////////////////////////' K K( i8 d( h- X/ L+ z
1 [' g# B8 P: A8 p4 z9 r* a- // with best regards ToxicDream
6 S$ h) y0 {# C+ E+ b2 S& p: T# @; @
复制代码 |
|