|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
# t& r: }! O' A% p* @+ e: eBy Mukta & ToxicDream- " z0 M; I) s$ A: U: U
- //for delphi 5# e0 E* J7 l6 K: Q4 G# N1 I
- unit MMDevApi_tlb;
. [8 k+ K, I2 i, Q7 C
2 B G: N; _) A) {- interface" O; q* {) }. l3 N5 M
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;# V/ b, }3 k, [' B
- const
k5 F7 S5 R! A* M' B" y/ k) A: V - // TypeLibrary Major and minor versions w- ?* ^ W$ G. O
9 }- R9 O: Z& M3 V/ Q, Q' Q! k- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
: U5 K& f- L3 o+ F - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';+ T, `; \% H9 R, Z
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
0 b, E; E6 Z/ Z - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
0 q" X8 d5 J/ S - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
2 E& T0 ^, J# B - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';+ a) Q+ s/ m* O# M6 L! y
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';) J3 [0 S/ Y5 L+ Z$ m) a5 W6 R$ x
/ T, V# w+ C: v7 e. Z4 H( F" G- DEVICE_STATE_ACTIVE = $00000001;
% l5 G/ n5 r4 L- @9 k - DEVICE_STATE_UNPLUGGED = $00000002;* F+ H5 D2 \# h. W
- DEVICE_STATE_NOTPRESENT = $00000004;
# E2 t& g' l2 k! v' B; | - DEVICE_STATEMASK_ALL = $00000007;- s9 a/ c9 l9 s B/ T7 y. t% ]3 s
- ( U7 ~- i5 ?9 o0 i5 u
- type
* v( A* V- A+ ?3 a - EDataFlow = TOleEnum;
( Z1 p3 i7 [9 b3 n% R - const4 @, F) S/ _8 j+ `* k6 J& ]4 ~
- eRender = $00000000;* }: j2 D! x% w5 U
- eCapture = $00000001;
D6 W' z7 g% J - eAll = $00000002;
. V" E, \2 S! B4 p - EDataFlow_enum_count = $00000003;
" i/ K" H& Q; B: J - 6 H( y+ C4 M0 _8 K7 @
- type# q! J2 v+ Z7 }- ^; B
- ERole = TOleEnum;
/ X3 A" ?/ k b" g3 @: g. ?" Q - const) c7 S" c% M9 v
- eConsole = $00000000;
0 S7 h* q* W7 l; ^. D9 D - eMultimedia = $00000001;
, v; k4 W0 k0 W - eCommunications = $00000002;
4 z# C2 M* ^5 }, V5 D/ x4 x; t! U - ERole_enum_count = $00000003;
. h1 t4 v) a3 ]. z( _7 F# ] - ) f0 h. g% g+ s1 v5 B* k3 p# j
- type
' W( [( Y( d+ B- z' R3 z - IAudioEndpointVolumeCallback = interface(IUnknown)3 }" ~5 O0 C/ r$ }: K* G' V9 \3 X% C
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']0 ^0 h. H% ~- b) G* N8 ^- u4 \
- end;0 ?8 u6 }9 l- c2 ]+ Q6 Z
- ) B( ]. Q, I% |8 y. y5 I7 b
- IMMAudioEndpointVolume = interface(IUnknown)
g b" C0 G1 Z+ O9 P* A: u - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
7 d* e+ G; s6 t* F1 B! g - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
9 M8 O2 c# y2 a0 z6 ]: z- x - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;2 a3 o0 u/ {* Y+ I- {, W+ D+ F& V
- Function GetChannelCount(out PInteger): Integer; stdcall;# w9 h+ y# q2 m3 ]2 [% x
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
, B Y" P7 C. Y5 ]4 a1 n9 k - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
/ g9 ]- Z+ p# m$ l - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;" I4 b) I4 _0 [5 l- Q
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
. ?$ A& ^$ o" d - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
: H7 } O1 p& @0 e q' ?8 K+ u - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;) b7 r* S& i5 `3 m$ u
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
5 {& ~4 L4 d2 @: k" m% ?7 \) { - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;) _& @# V( k( h) H# Y
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;: t4 ?5 Z& w6 T k! d
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;
: m# p3 ^/ ]- o0 N l; d8 l4 Y( s - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
K# U. y7 D8 V( \$ S9 {' z - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;( Y+ c& f7 W, z3 ?* z& x, S
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall; `% n- V8 f' ~8 j$ Z! c
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;! Y3 Y& B( B: ?( N' |( w2 C
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;5 a" a5 b' @3 R _2 D- X% a: z: M
- end;
( R4 I9 `- g) S7 h
( ?6 {# Y+ b0 W- { IAudioMeterInformation = interface(IUnknown)
4 b7 b4 k a o, G S/ L3 x1 C - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
- n4 o* d* R. q1 s6 {9 r - end;}" G7 V# ?. M9 [7 T% Z
6 r; E* x5 B7 ]$ E% o1 k" s- IPropertyStore = interface(IUnknown)
|3 i2 o2 c- Q* H- v3 v, E - end;6 i* V- P4 k: k) r& |
- J5 R# @" _4 J( V, `) ~- type3 \3 h" k( F, f+ M0 R+ D
- IMMDevice = interface(IUnknown)
3 d+ A! z, U4 j7 @- l- U - ['{D666063F-1587-4E43-81F1-B948E807363F}']
6 F M" b; Q* C' [ - Function Activate( refId :TGUID;
7 {, ~. K5 Y( L8 a- E - dwClsCtx: DWORD;
' P1 I% p) }& X$ V4 z9 [& V - pActivationParams: PInteger ;
( ~* s5 o8 a- _ - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
/ D3 ~6 X; M5 O+ Y$ S - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
8 i. f7 E4 h% w; S - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;& M) W p& o+ a5 Z
- Function GetState(out State :Integer): Hresult; stdcall;
* l, e- W5 @3 f: u w
6 a) O8 D9 Y) ]8 H' E- end;
! `- ~; z4 U+ `9 V: A
% E# O* B+ n6 C
1 ]% ?# s( ^# {' Y- IMMDeviceCollection = interface(IUnknown)
$ ~, U8 U# l$ u$ ^7 B3 t, R# Y* Z8 k - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
6 L2 Z/ \ P2 h9 ` - end;
5 r; K& f7 ~) d: m - 0 G+ ^: r$ T) T* i0 \) K, g' s
- IMMNotificationClient = interface (IUnknown)
& f" d& j: \0 v# F" J - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']+ m$ Y, Y' _6 r
- end;
, x7 g/ Q4 V: k( v$ z7 w8 S
- b& T7 ^4 D9 F6 k0 d- IMMDeviceEnumerator = interface(IUnknown)
! U8 x$ I& A4 L6 ^& B# F! e - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
5 F% [3 R: _! [; B" ~, b - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
! [* r; X8 K Y- E2 c/ S - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
* A% l! j" ~/ N# y Z3 o - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall; ~5 d& ~8 [9 K6 m6 \
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;7 B$ }9 L# R% h8 j9 T
- end;
8 N( `+ }" O. | - 4 {' k5 ~3 w& z8 B4 w& G6 w( c3 m
- implementation2 A' \6 {+ o* z4 E
- end.
0 L( _5 R4 w" A6 [
9 S: [3 o. M z. l3 q- Thanks & Reagrds,' S" O& r7 l; J( H6 ~
- Mukta ...$ X3 o- P2 c8 b/ R* n# L4 v( R; W
复制代码
6 Q0 E+ B& J- g$ q2 {4 F$ v4 z- it's work in Delphi 7
0 q* V7 Y7 q" T - //////////////////////////
0 |! g/ O3 ?3 N$ t& }
6 K0 ] ]& m4 a. S# J& }- unit MMDevApi;9 I/ f8 i4 Y% W& u4 F+ P5 ?
8 E0 @" E3 k" \! l9 a- interface
+ N0 L3 K. E; `5 Z% E% z5 b
2 T3 {; A* O" s6 o4 t7 l+ H; c- uses
) u8 H7 o+ k, _. H - Windows, ActiveX, ComObj;
8 d, m/ e+ z0 b& ?
/ `3 M5 s3 ?% I- E; O+ `9 u) R- const, e+ @ T6 o0 |& s; [8 L; \
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
8 E3 f& E8 T) I* d2 T" `$ l! I& i9 v - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';+ v6 Q! M" s' F% C0 C6 K: n
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
- I' ]0 p$ [: r, E# o* u3 k8 J& M - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';5 n7 p& D" y8 r
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
9 w7 l, U: ~. a: r - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';0 ?- N6 G c3 m6 r1 I+ a
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
4 B2 i+ |/ l0 x7 c- m3 W1 e# s/ ~: j - ( o! q: y% W; L6 }; g8 b
- DEVICE_STATE_ACTIVE = $00000001;/ K/ _! c, Q: N. s
- DEVICE_STATE_UNPLUGGED = $00000002;
7 k+ r* e' A5 f7 V) T- c - DEVICE_STATE_NOTPRESENT = $00000004;
; a; L+ S) h! T5 L) y7 n; J& Z3 D - DEVICE_STATEMASK_ALL = $00000007;
4 t& r" {7 u }' @+ s - ) ^* l/ f# s. q) m, M2 O
- type
! k+ ~' Q' {. l! [6 V - EDataFlow = TOleEnum;
8 ]/ M. B+ ]+ T5 F - . O" Q. j- K, h3 a6 h9 W+ f
- const
" t' Z5 `9 {8 V; z - eRender = $00000000;2 y. z4 h( H' A$ `- q% K, |3 C
- eCapture = $00000001;7 i- L- G! S/ N
- eAll = $00000002;3 _6 K( ^$ d1 ^) S
- EDataFlow_enum_count = $00000003;+ Q) F5 H, R! h$ B1 O" D& l
- P1 }; Q* e5 y1 C# L& ?, `
- type6 |0 ~3 f, m0 O ^+ m% ?- [
- ERole = TOleEnum;: |3 V) }' z" h+ V) o) r
- 7 d& w/ @1 m! j2 |3 R7 X! C
- const* k) c& S ?. Y0 L i
- eConsole = $00000000;4 V1 V- t9 y8 S# @" @ `3 Y* H
- eMultimedia = $00000001; v! _4 G' n$ ^- I. C
- eCommunications = $00000002;
s% D3 Y! Z. `* }6 ] Q9 D - ERole_enum_count = $00000003;
* N* S1 b5 {, a! i% F
. \ D2 k# ] U, p5 L- type
9 O+ B7 l5 {7 x' j! R3 I5 } - IAudioEndpointVolumeCallback = interface(IUnknown)
8 w; p+ S# i. S! t$ y3 J - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']8 {9 F# `* k' L: k/ C* d/ N) k( F$ G
- end;
& b( D3 I6 n- Q, m- ~5 _
, L5 [" r- E' `% J+ b5 M% Z- IAudioEndpointVolume = interface(IUnknown); \ Z. O7 a2 L4 ~# n& S
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']* F" M7 V6 G# e
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;! V; g$ H/ ~3 V d: [9 P, k/ \
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
" x& u1 |- n! E2 a: k - function GetChannelCount(out PInteger): Integer; stdcall;
+ m" F* k, K7 X) |- o - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;' t& C7 x0 v! a1 Q
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
! n/ o6 M4 j$ O* d C% Z - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;% y. R$ p3 t% D. U: w
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;" I( w/ g0 `* P% q v
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall; F7 M0 f6 {* N$ K8 g" B8 t
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
; K, z6 Y, ~5 _. J - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;" r* B2 L3 f7 A- x) ?
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;1 J0 Y; [+ a9 |- u
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;, M" a# K6 I/ ]3 M6 a3 g( v
- function GetMute(out bMute: Boolean): Integer; stdcall;1 B- i5 X- z- Q
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
/ w5 Y9 p- {# ]( L9 _2 o% H4 r - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;3 N7 r$ u# t) D- D: m9 ~$ M5 K
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
! `( M1 T/ n7 U3 H' Y2 g - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;+ y! v1 O, I, \2 t! z K. A3 x b5 T- h
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall; h# J) E" ^- {) m/ `" I. Z+ {
- end;. w) ~3 ~, K) M/ K
7 j6 {0 n7 i* q$ y2 E- IAudioMeterInformation = interface(IUnknown)
5 v; A4 }! ]) ? - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
, m) I7 B- Z' }: ? - end;, _% k2 _5 a! P) w; S* w
" h' |' w% M4 | G' U2 l! \- IPropertyStore = interface(IUnknown)% A- b: Y. |- T. P K
- end;* e1 O9 M2 X k6 q
- / _- c1 @& ~0 ^3 l S4 \: O
- IMMDevice = interface(IUnknown)
" n. N. b6 E9 o2 V; L - ['{D666063F-1587-4E43-81F1-B948E807363F}']+ x: {5 a: a6 i
- function Activate(const refId: TGUID;+ X2 g9 `9 L( D
- dwClsCtx: DWORD;
4 a) J, n/ F. b1 o! o - pActivationParams: PInteger;
. P2 z7 E4 t( u - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;- {+ S9 K2 h2 p& }2 R
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;1 m" U9 r* n# v; W J
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;% N5 b- N7 F2 Z. S
- function GetState(out State: Integer): Hresult; stdcall;
% ~1 H% f4 l' t) L# w - end;
& c# g( z L# {% }. s2 g' t - " @6 V$ R: I, W5 u; X
: V8 @/ u- K1 r2 i" [& o9 g' w% q+ z- IMMDeviceCollection = interface(IUnknown)0 A! R: Y* g$ r: z7 C( v
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']! R5 R8 N! A9 x% N! H! }. K5 u$ k
- end;
+ l* y; F8 d* ?+ z5 F& _: C; V
/ H" e) i+ Z6 k U- IMMNotificationClient = interface(IUnknown)
( x3 D3 K. P1 ?5 b& P, ^6 {6 R - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']' H+ A0 f/ `/ ?" T
- end;: o$ S. v) [2 x7 M
- 0 ]% O1 b" v" T$ z' I1 x1 X* Y
- IMMDeviceEnumerator = interface(IUnknown)9 N( e+ |& k% n7 W% e
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
2 `' [' B5 `& o; w4 i! s Z - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
- h% K4 H w' b% W7 u7 u+ E/ w - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
9 X9 N4 w8 H! _ Q( @% K - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;9 u$ Q q0 F( F% Y' w5 C
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;; U4 H8 `. K% D; e
- end;/ v8 m* P/ a3 Q, i! q& J/ e
8 d9 ~' X' L) p* @4 g& l- implementation
% t8 w5 c8 M% o( O' F
* V+ t$ |7 b. Z" S4 L& }/ X Y- end.3 d0 g! J* f3 Q7 c2 p; }% V
- - z+ i; [- k1 W9 b
- ///////////////////////& d0 F* E+ `% D" @, |
- simple sample :)
5 o% y% |- L2 n7 d - ///////////////////////
, A6 L2 u, U$ o8 t& O/ B - * @" c! s5 [4 K `
- //...... other code" K+ T9 ]# ~, A! y
- X4 [2 j0 u9 }( u5 G, _; H: `" U# A
- uses ... ActiveX, MMDevApi, ...;. S- {' D e# k7 J3 e' g2 d
: l5 R2 c$ E/ J j& ~" q0 N6 Q6 w- //...... other code' c, _; L% n% U, n5 q
- % M( I L3 y/ o" q; [
- var
' K( g! r! y1 k$ m; I - endpointVolume: IAudioEndpointVolume = nil;6 O! H4 W# v6 s: i) z
- & \2 e$ n+ y7 B- k4 \% ^
- procedure TForm1.FormCreate(Sender: TObject);
, T! R0 E! s/ f v- P - var
% P. u( z6 a; U+ @+ f; B - deviceEnumerator: IMMDeviceEnumerator;
; Z; E5 F& r, p7 \: x" Q6 q& P8 Q - defaultDevice: IMMDevice;$ @: M0 n0 g6 v
- begin
b: c1 c- \" ?/ r2 w, T1 y$ f4 I - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
! s2 d. M1 z f! b1 o* t" Y: h - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
7 `. C5 s9 r: y% g }9 H' S# n - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);2 J, T, N* d5 q- p$ H8 m4 q
- end;* }) }7 @/ A) Q& a% b
- ( Y# A J1 d* \7 b0 U6 N) C. s
- procedure TForm1.Button1Click(Sender: TObject);5 J+ ]/ F- O) T) }; g. a" v, H
- var; v/ R5 @3 `7 i* J! @8 t
- VolumeLevel: Single;
; f- @4 @, I+ g3 D. Z - begin5 C% X( k& f2 D+ k4 s
- if endpointVolume = nil then Exit;( X* D, p$ e) ?; j$ f: _- {
- VolumeLevel := 0.50;' h; l9 ?3 v9 L
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
4 p- h3 n( S6 n8 h w - Caption := Format('%1.8f', [VolumeLevel])" e. Q% F/ z0 J* h6 G. u
- end;' k0 i+ R# l$ ? M2 c3 ~
; f5 S, M% T4 U, s1 P, d- \- h7 N- /////////////////////////////////////8 h8 a' {- O9 [3 F" i9 A
! ?' _* _0 e2 b$ E# _9 a/ r- // with best regards ToxicDream
# F. L0 N5 o/ f
复制代码 |
|