|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
& ^5 D2 ^- M- Q0 a- ZBy Mukta & ToxicDream- ' `0 v. ?# Q) l0 O$ @
- //for delphi 5# t3 D' o) J; m! L$ }$ z4 U: y! b! w
- unit MMDevApi_tlb;" Y. d$ X5 u# j' Q! f
- ^3 t5 x8 x$ Q" P/ Y+ U
- interface# S3 \$ \3 F- m5 o5 ] R4 Q# a2 O
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;# G6 ?7 |. `$ `
- const2 N/ y" B. P6 B0 ^5 d4 {/ F; a2 g
- // TypeLibrary Major and minor versions# A5 b% b8 P! D
) W3 G/ J" j/ W. r- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';6 C6 Q; Z8 r/ g: I) I/ j: l
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';) I" ?. b+ g, A1 y
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';. F3 C9 A/ v8 m* o. H3 ^8 m
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
4 w$ }* X( p: ^2 }+ ^6 `9 v - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';, D8 k9 X2 D0 W% s9 z! C2 `' k' ^
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
' n/ |. t& g: K# @ ?7 y* y& Q - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';1 ^, \, J6 P, U8 G
- M. Z2 K/ l- Q. s" Y1 ?' X% K
- DEVICE_STATE_ACTIVE = $00000001;
! H5 F3 {" d% A7 ]1 s, c - DEVICE_STATE_UNPLUGGED = $00000002;9 Z& S& K8 J. z3 s: g/ [5 f- {/ A7 E
- DEVICE_STATE_NOTPRESENT = $00000004;
. A4 S; d$ P2 g0 U y! q7 R - DEVICE_STATEMASK_ALL = $00000007;5 c# B6 l2 h7 E9 @- k) O7 z+ w
- 6 f, q8 O$ H2 b% S; t3 f
- type
) q1 T, ^: r4 \ - EDataFlow = TOleEnum;
/ i5 E1 o7 c) r6 u) W; u! H - const
& M: Y* q2 @* L) T - eRender = $00000000;# K7 `% ^/ H5 q# I6 _8 |+ A3 W
- eCapture = $00000001; e) F6 q: w5 l5 }
- eAll = $00000002;! e: _ f2 l: l( L
- EDataFlow_enum_count = $00000003;
0 R# e/ I9 c+ l }! n9 u+ C - 4 \0 |4 V0 V& B- S t: b: T4 t
- type
0 f( A) ]$ A4 S# S. v) n1 H - ERole = TOleEnum;& F* j# }& c5 s7 l. D0 f) m2 K2 P
- const i, K* Z \" @& \" e
- eConsole = $00000000;
; n" u( @* Q6 d/ L, L n2 n - eMultimedia = $00000001;$ _- {/ Z; X5 |% L5 o, Y- ~
- eCommunications = $00000002;
& H N" b. W0 r: H - ERole_enum_count = $00000003;
" v, C8 w9 P& e9 ~! |
3 r( g- i) v5 N/ P H( R- type
) |- E9 f. R: ^! s: }7 S - IAudioEndpointVolumeCallback = interface(IUnknown)1 j4 X! V' d1 n* g3 }) e
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']' y7 K \4 n9 @; J! Q8 g! b
- end;
# `) `* O. m/ z k( j5 W4 s2 j - , X$ n) i2 Y# _, g w9 B4 B+ W+ J" `: M6 Q
- IMMAudioEndpointVolume = interface(IUnknown)
( S* _- s; J' A7 y+ j7 n - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']! a$ r/ [# k1 m. z r6 c
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;3 K/ {, U2 W( U( h" G
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;% |6 L7 f; `/ v7 }7 w3 ~
- Function GetChannelCount(out PInteger): Integer; stdcall;
" c. ~7 [9 m* i - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;- T E$ q( S) b; K/ M% D
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;- Q* ?& x U- Y4 J4 |
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
! x/ A; d% [; G7 T) b - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;/ U( S8 A+ Z8 Q) Z
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;0 H. [, R4 ^* d+ C- j8 U3 t
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;- c) q* [7 F5 R, N
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;, `7 w. f: `3 M; P5 P; w
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;. ~* k; o9 v$ g3 @+ u
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;/ N! N$ a0 S) q5 ^$ g( D
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;
; i( J9 p2 b( S' d9 g - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
+ \; ^) B0 b8 i/ W# x" Q - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;1 `' [0 c" O$ S/ [# M
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
0 \7 e; U. m# @4 N - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
5 E% U5 ^# r8 E3 A$ Y% V! m - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
& g0 v1 }8 l# `! Y! a: z; k1 h- ? - end; X" Y# q: E+ W7 i# X% P
- & _4 m4 @' T/ j- T7 r
- { IAudioMeterInformation = interface(IUnknown)0 X! I( m$ k6 {- ` Q
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
% R5 p7 ~4 z0 {. E - end;}
- i1 f2 o+ S! \0 A! { - & U6 d# M' A2 E# r J
- IPropertyStore = interface(IUnknown)
+ T; }& M ?8 |# q - end; S p9 f1 B* r! |& h* o0 n: s
- ( C0 ?. k( m+ c" U
- type
' d/ }2 Z6 Q4 H; z9 U% q - IMMDevice = interface(IUnknown)7 ]9 F$ f. E7 C0 N
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
7 w, z4 [; F+ M, L# [ - Function Activate( refId :TGUID;( a' C9 j) R; }* O* Q" }) [
- dwClsCtx: DWORD;; B! h( v9 y4 N: B. y; _" P% }
- pActivationParams: PInteger ;
\/ o# @- ?% T6 ~4 w7 c+ k - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
9 g$ t1 K6 C# J' L! L0 b - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;- }$ ~: l! p$ Z, g1 W) A% {. J: ~
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
2 D2 K6 g2 K! h% v3 x& O - Function GetState(out State :Integer): Hresult; stdcall;
7 W- ?, ]# d3 D1 A - : b9 X9 y/ z: t
- end;& X; v# v2 N N7 b. v& P3 f
- 4 {% n3 s; ?* P" w
- # Z C( {1 o- f% z6 N8 ^ i
- IMMDeviceCollection = interface(IUnknown)- Q0 W+ E ~) j! x: y! f( }
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']/ M% q; |6 c5 Q- @% U4 t% U' z3 m) P
- end;
0 P8 S7 V) D7 N/ _- x
, e5 Z, M7 Y# g) G% Z3 [) C- IMMNotificationClient = interface (IUnknown)
7 W) \9 K6 J, D2 a - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']3 t- O! e' D. h* @$ V
- end;2 C0 P. \* X# @9 ?) P% q/ ?
* X* Z6 m6 _$ f! a0 ^2 D+ C- IMMDeviceEnumerator = interface(IUnknown)
$ H, a( C9 @5 Z, p- F - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']% z6 L" d2 O$ z( \% ?( W
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;- {" f6 u6 m6 `$ O
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
5 p% R8 b! Y: U, e3 j- Y" _ - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;. C7 B1 Z, K# ]# J6 D
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;/ _* t2 y, F' j6 m% J
- end;
t& N( S, M. u* ]6 I/ V
8 j# ^. L( ^ I- implementation
& q. N! Y7 k8 |4 ~ - end.$ D! t' K" V1 u u' }4 x- \. k$ O
- $ \* @8 u' s9 [8 @
- Thanks & Reagrds,
6 e6 K. N, _' t0 r. m! @, w - Mukta ...
) G* f4 L- O% o8 t2 S
复制代码- 3 H: U8 Z6 m- E! ~ D7 b' Y
- it's work in Delphi 7, Z: C1 ?0 m# B
- //////////////////////////' D5 u) i8 K w2 w1 g
- # Z" ?7 B, Y3 i* H' ]: E# I
- unit MMDevApi;
$ m+ _; ^$ G" j - ! ^; B. A2 y6 X
- interface
9 Q9 J9 O4 J! n4 F4 J& I6 u - # N8 q/ ~8 ?' J ^- B* v, L
- uses. {* o8 z- c( R# |# I
- Windows, ActiveX, ComObj;
$ X; v( v- S% ?! \# l) y# @
4 U6 X; r; P C' W* b- const
1 t% c q j( E: Z - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';- T: C2 v. N8 D4 u
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
8 M& B0 N! z W, C( t+ k1 b' v - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
8 s* i& z6 u6 v! b( b- S, ^ - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
N4 a$ [) K3 ^) A% y - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
5 X3 V2 l8 b6 [ - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';7 U: h3 Y4 j5 P+ d6 W1 @
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';9 h0 S# M* S5 b$ L
3 P/ f) k$ J0 \! u/ x( E" c& u* c- DEVICE_STATE_ACTIVE = $00000001;
+ Y1 ?4 X8 X& U2 J - DEVICE_STATE_UNPLUGGED = $00000002;: Y7 K+ w3 D! Z* D
- DEVICE_STATE_NOTPRESENT = $00000004;
/ a/ m$ y( t9 v5 R- e+ _4 ~! z - DEVICE_STATEMASK_ALL = $00000007;0 w; _ q+ X* @
- 2 B" N% }3 K* O# R* p k! g
- type
* N- U6 L$ w) G4 O Q) m. h - EDataFlow = TOleEnum;
; ~1 ^3 _% @) J& S6 U1 Y8 N
' \, j5 o* M2 e6 v- const
+ B/ h" n% |9 f. S* q# B6 c - eRender = $00000000; s+ R L1 S5 m; g2 \. v9 R
- eCapture = $00000001;& ]2 b# n, n$ ^4 X0 `% T4 g# @
- eAll = $00000002; G* Q" J2 E- {5 T- B! g: o
- EDataFlow_enum_count = $00000003;# A/ p2 N8 G/ p) ~. @
* m2 q1 R: q/ f C L/ m- type. f1 D' P0 @1 y- {
- ERole = TOleEnum;
' O( U4 V$ i* I) X- |( K0 a - 9 M6 l8 G! p8 x/ ~: i' o+ ]
- const
8 R3 ` m7 ?: }3 g" Z& h, E - eConsole = $00000000;! t- m+ [3 Q# t5 ?4 }, j" O
- eMultimedia = $00000001;2 W7 y* l7 H% q- N. b. `
- eCommunications = $00000002;
; J# R/ l8 s- W1 N. v4 G( S - ERole_enum_count = $00000003;
4 |( g* D" m$ W/ N9 n5 q, I3 S" C - 6 p( V \' r; k! `" B' X
- type
+ H6 T; }) @# B# X, Q - IAudioEndpointVolumeCallback = interface(IUnknown)
7 T, M! h9 M! h8 g4 i* B - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
- p3 i1 _" j2 \: `: D - end;
" k& x9 D E, e/ `/ v
5 Q$ B1 i1 |7 e! m. d- IAudioEndpointVolume = interface(IUnknown)
* E) H8 X0 p/ s1 C. ] - ['{5CDF2C82-841E-4546-9722-0CF74078229A}'], m: B/ z3 D- G0 |5 a6 w% |
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
$ t9 T4 D9 g. s2 L - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
. {! E' b3 v3 b, J) Y8 | - function GetChannelCount(out PInteger): Integer; stdcall; ]3 ~* l+ m% @% f
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
/ z" J. D1 j2 c6 }! e c - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;5 r6 ^ u9 Z r& J- j" C
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;/ K5 F' V- R. |/ T/ }$ P
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
5 w/ W+ D* r" O \. e8 O# Q - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
$ m2 p* p2 H4 v/ R - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;/ K9 k" H" B7 p5 a7 \' M6 |: b
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
5 c; ?3 @( ^0 M7 u; _* U. J - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;3 B% s7 E- Z1 d( o( {5 X
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
4 _' I' K- n+ [ - function GetMute(out bMute: Boolean): Integer; stdcall;
. m. m. Q/ ?, Y1 } - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;/ H9 P+ h, _( S8 g7 R1 n2 U
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;. _; n$ @- C$ e
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
2 m. K+ r8 A/ x0 f0 e3 r7 B& M - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;, D2 g2 n" K) u0 {% ^+ r
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
& T5 ~5 U; _& F0 B7 H* h - end;
- r* x9 g3 ~' N1 N4 z8 [) j2 Y - / u4 Q, j/ d2 u" X# Y# A, Q
- IAudioMeterInformation = interface(IUnknown)8 `* }. u+ A/ [2 f. Q
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
6 `- r' C( y }( z) @- I) Z - end;
/ s3 u {" ^+ I0 d3 ?
9 \, r. l% a0 t, a7 ]( [5 [. F- IPropertyStore = interface(IUnknown)7 J2 o4 K& T3 a6 ~
- end;1 }+ [6 k2 D3 {& |% D
- " y# Z- h' z5 F# q
- IMMDevice = interface(IUnknown)
# C4 m) x1 @* r/ L; o7 E3 r0 B - ['{D666063F-1587-4E43-81F1-B948E807363F}']9 B# ]1 h* v" y% @, Q O
- function Activate(const refId: TGUID;" Q7 J. Y! e7 w/ D
- dwClsCtx: DWORD;+ l& `5 J1 r2 \
- pActivationParams: PInteger;
% Z3 {! `' H: D# n) F - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;8 M. l d4 s, N) y0 _
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;% W% l2 \% @4 k6 i* l
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;- v0 _& p# P- f$ e e& R
- function GetState(out State: Integer): Hresult; stdcall;# a Y3 z* E3 Z# _
- end;6 w* x. S' v. o4 ~# ^/ j
- $ Q, @, N) W% K( y
- # g$ s6 i1 q0 n/ l
- IMMDeviceCollection = interface(IUnknown)
6 b: n, P5 e3 A7 ^$ E( S) c2 Q* a - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
! i A' I! P6 C4 B! k( H' u8 \ - end;# h* k* {0 K, k3 j. T7 o1 v0 u
- ~) q, X7 ~4 j0 w
- IMMNotificationClient = interface(IUnknown)
) S% C, @' {5 u* i. F& D( h - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']2 O d. H$ e. g
- end;
+ A& [3 u s4 |: _8 H1 z0 @
: l, L D/ q" R- IMMDeviceEnumerator = interface(IUnknown); g$ a v, c" u
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']' f5 }' _5 V, Y# C
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
5 u* N# P2 V% ] - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
! B! e) ]1 x% O( x0 w% `$ F - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;" D* R0 i2 b) d/ S
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
, r( p7 O' A6 x3 _1 X - end;+ Y' Q6 \+ x; l6 h. D' I# e
- - v% i u3 A' s" i
- implementation
- k6 `# W8 \3 m. {- ]' R - 9 B" l- _3 o g% [
- end.! {4 P$ z6 h4 ]+ l- `( A
3 }3 @( p5 E* d! u; D/ ?, e; c- ///////////////////////
/ A V7 P; w0 I* d" Z1 t1 m+ d - simple sample :)9 z1 I4 [4 ]' w1 r& y) w9 ~- I
- ///////////////////////, q* J4 s3 |& S5 }% \
- " H% \+ `# Y; A, w7 k
- //...... other code+ M+ Y0 E( H+ O9 @8 J
, v8 S; |$ i4 M+ U, e- uses ... ActiveX, MMDevApi, ...;4 }, |0 C3 U4 e2 M
, J \9 w. i- b- //...... other code
; g9 M% M. |! A& c8 i* s7 G1 r
- r4 r/ A0 a: W3 J: B- var; Y5 k3 W A/ [ e {
- endpointVolume: IAudioEndpointVolume = nil;
, C. Z" L3 X! f: t7 g& \ - 2 [* _4 w& [& [6 v$ ~2 Q4 ?
- procedure TForm1.FormCreate(Sender: TObject);
* [. t; L' v N" d6 e& O - var
0 g: {. H& E/ o0 z4 C3 ? - deviceEnumerator: IMMDeviceEnumerator;) c: d! Q5 c6 Z( ] T, v+ [
- defaultDevice: IMMDevice;/ ^$ |! P. L6 n4 X4 J8 p
- begin
. }+ Y1 M1 q. R) M5 ^ - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);( P. h5 [9 J4 X2 e- L2 B5 k- t: N3 X' n
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
7 \6 ~5 h- E- q( |! C/ O- |1 G - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
, [0 a5 u1 X" M- l; p - end;
' I& l/ ~: z6 j6 C. e. k: N, w
; C. O% h* I' i1 e: [% R2 ^" C+ _- procedure TForm1.Button1Click(Sender: TObject);
" r+ I. [0 }7 L' U+ E - var
# t& ? E( k" c) n. o4 i - VolumeLevel: Single;9 m% T `% y9 E
- begin
+ j$ S) }' |& z; i: Q1 C - if endpointVolume = nil then Exit;+ Z2 O4 b6 W4 X0 j
- VolumeLevel := 0.50;
}* ?$ d! ?. \" b, Y - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);* o5 Q7 L! L t+ {/ [
- Caption := Format('%1.8f', [VolumeLevel])
) `& I3 x; H7 Y8 W3 q) C+ P6 y - end;
, u. e1 y2 @4 n8 n5 j - & U% k6 |: D \) S: }' B
- /////////////////////////////////////
1 i1 Q( }0 ]/ T& @2 G* N8 ~ - 7 I3 y; `" U% L& D$ ^) n p
- // with best regards ToxicDream
+ ~% a" G( f5 o& E3 h ~
复制代码 |
|