|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058# [ K7 h2 Q' G, U* d
By Mukta & ToxicDream
) n: K8 V# g$ Q* ^. V4 }- //for delphi 56 E2 R: r7 M0 X) D
- unit MMDevApi_tlb;" Y% W6 M. _6 I, R7 X# I+ ?5 R
- % p0 G$ c6 Q K# ?
- interface
8 k% l+ m+ j9 B5 g: L - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
2 f$ @9 p: U5 q, M' B - const
8 d9 C9 i, t S - // TypeLibrary Major and minor versions
4 }7 t! |, x( L - . t2 O$ I+ y! v: o& g5 U
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
6 j! P/ w" X" \9 o5 I - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';( I1 |7 G$ `6 O9 S0 p8 ^4 z) K0 E
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';8 e: H' m4 @9 f% k: j
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';5 V4 K0 a0 O7 U3 o) H( A. l+ _
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
, A( V- B& `" D2 V/ J+ w4 M4 d - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}'; y. K; i3 q1 C+ W% Q) [7 }2 W6 Y; m
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
! k% s' u6 F( N. Y& V- T$ ? - 6 P! ~. q1 T' S' i7 |; |: {. j
- DEVICE_STATE_ACTIVE = $00000001;' |- I) y) m, o( i" {; A
- DEVICE_STATE_UNPLUGGED = $00000002;1 k. [- P6 _6 ~ M# y6 ]6 l
- DEVICE_STATE_NOTPRESENT = $00000004;1 ?/ q6 t4 W' ~/ _8 ^& B; x2 e
- DEVICE_STATEMASK_ALL = $00000007;+ e4 [% G5 A/ ]$ o
* y1 s8 V6 ?3 i- type. m. r; T% _; V' m
- EDataFlow = TOleEnum;2 B5 ], u5 s5 C' a" H) u+ a
- const# @& T) u: _ M2 g
- eRender = $00000000;
7 V4 V; C4 v1 Z9 Y3 B$ h, K/ J# d - eCapture = $00000001;
+ Y2 i1 P* a4 G I1 j - eAll = $00000002;7 o2 h8 d, B* E8 a+ m- s0 k
- EDataFlow_enum_count = $00000003;
9 c# k( ]$ D/ `* M, r! K+ j
" l' p; }7 _. p- U0 _. N: `- type
" b9 ^) i! G# e# I" U5 U* w - ERole = TOleEnum;; j% x/ D6 y: A! b2 [
- const" V8 @# e6 ~& I6 A4 P1 u3 r4 O2 f
- eConsole = $00000000;0 R+ {5 D f- q. Q3 Z$ ^
- eMultimedia = $00000001;1 H( o+ C# v+ Y1 u a
- eCommunications = $00000002;: J% D- b8 \3 O! j* |
- ERole_enum_count = $00000003;
" q) @" g$ z8 {. Z6 B - - l+ a) J; v8 r' X$ a. Z+ [" N: z
- type+ ^# W2 E/ C( V
- IAudioEndpointVolumeCallback = interface(IUnknown)
+ |5 U* ?$ T2 @3 f% b/ i - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
0 R1 R/ t8 X$ s2 {7 [3 R - end;
! g& H; z3 j% Z/ L
/ S, K* N# b) d- IMMAudioEndpointVolume = interface(IUnknown)2 |: J2 [6 X( n1 ?# ?# h
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']1 _: x7 X" s& o' e2 R
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
5 B/ y9 L, b9 u7 U1 I5 O - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
" Q3 E1 N! b; e - Function GetChannelCount(out PInteger): Integer; stdcall;
! h- D5 N% R9 p, o; _& f% g - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
4 P5 C% ?+ P4 G, \4 [0 P4 v - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
# r: K* [: n& @. F6 C( o* l- j - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;: @4 o) u0 \# L3 Y/ ?
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
4 t, {; J% I2 O ?; } - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;# e/ g' H. P! h. x9 H/ m
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
6 j3 b7 H( J- S u. g s - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;7 ^! c K( }( t, `1 L8 n
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;9 r* f" I) o/ F: V4 I' `
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;8 ]7 Z/ x0 R5 T; J$ N) j, t
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;
3 I& J1 d1 z2 ? - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;* \9 L$ Z$ Z; C( z4 x1 s( T, [1 I& P
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
0 o; K" A9 D! E- v - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
3 e& o6 s# O& z, v# B0 U - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;& r6 ?7 o, y6 {( }
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
) t3 j0 Y7 I L& n4 s/ v b5 { - end;
5 T- R3 _$ x# y' W- |
7 \& q j, x7 }. x) m- { IAudioMeterInformation = interface(IUnknown)3 H$ h9 F, P2 u+ D& _6 z( ]. o
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']% \$ c' x6 W2 p% V
- end;}
, S" N! f, P6 T8 A, R
6 p5 v# g F% Z4 ?# P4 }- E! q Q) f- IPropertyStore = interface(IUnknown)
# {: z# Q6 b1 A - end;" n- Z \& H2 ?9 o( q: B
, k. ^2 x2 b g0 E3 ~- type
! Z& K) J% }& h& u, T - IMMDevice = interface(IUnknown)
5 {7 \0 b. M* ?. p) J( L8 T" h - ['{D666063F-1587-4E43-81F1-B948E807363F}']
: h8 J7 ~$ y( H+ X* u3 z! [ - Function Activate( refId :TGUID;2 {' q1 M( E; a: K8 O- p: ^
- dwClsCtx: DWORD;9 R( s; k! r/ q/ q! h' B R
- pActivationParams: PInteger ;
1 W0 [" N$ a" C! j - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
( d3 S! `7 R& a - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
- K* z! R1 a9 j - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
9 K3 [# i! n2 R% z% X - Function GetState(out State :Integer): Hresult; stdcall;
D9 b% w0 s+ |$ f1 { - & `8 S* {; N G+ p* ?7 w5 p
- end;" e% ^, P7 T; X
- 9 w7 V1 C4 A! |$ Z- |# U3 T+ p
* J+ o0 Z' o1 W' v8 B# G- IMMDeviceCollection = interface(IUnknown)7 X7 W4 \9 [6 J/ T
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
; p. f8 p' n3 ~3 I2 L - end;
# z6 A/ g: K+ r$ l1 f5 y
8 J5 o5 t1 U5 C- IMMNotificationClient = interface (IUnknown)
" [$ u; S- Q' o. Z - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
* L5 q) Q8 {6 z6 i2 g% \ - end;
% g- d/ e; @7 [2 |7 M8 E - ! A0 k0 k! s6 j8 r, ]7 h# u
- IMMDeviceEnumerator = interface(IUnknown)
+ U G$ e5 ?6 \# s5 b, ] - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']& m. b0 N! z2 J/ M
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
: a/ {) [2 R2 s1 v8 i/ r - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
1 q+ W# Y; X5 e, @5 y0 [ - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
h# G; Q' N$ a8 D' Q/ i# S - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
' v# [+ h1 m% p2 A" V3 m: i2 S - end;5 d$ D' k% h. O4 ~" t1 `( @; C) C5 s
7 K3 D2 U$ `. [; S q6 w: w* _- implementation
; O2 Y ?& L+ _9 @% o& { - end.$ T$ E0 p( C) m( ?8 S* ^
. b( s; J% B v& c3 d- Thanks & Reagrds,
% o+ i( e. O! S: \ - Mukta ..., P0 A& Z& }- q" ]1 ~3 x. o5 ?! s
复制代码
/ w+ h- V `. p( R7 z% O- it's work in Delphi 7: A: z6 y$ F ?5 k: P, l
- //////////////////////////9 h; J7 v) v; N9 L
- : j$ o& J4 N( g, a% A
- unit MMDevApi;9 T( ?) Y5 P( N9 j
2 {% h9 ?" `' B! M9 ]# ?- interface
# o7 w: a( \! \/ P, O, P" H - / ~3 K2 t1 g5 \9 I
- uses
# \$ ?; s) N! e. ^ - Windows, ActiveX, ComObj;
/ L* W; X3 @; y; |# K+ _' N/ F: q
9 W, n1 J) u# I# p4 A% k; K4 K- const) [/ {8 ?2 u' c5 b @+ j
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
- m; U7 c$ e0 t2 d ]/ ? - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
* u) F: i% q, @2 V! ` - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
$ F# z. U5 O1 e$ s - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
- _% a4 q9 {8 [+ J5 k - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
' s3 X1 ?7 ]! }* W& f8 u - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
8 p$ y, t4 M4 C - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';9 D9 u1 F8 }: G x
- 5 x& i; y7 [8 h, S. Q3 w. `9 t9 d' Z
- DEVICE_STATE_ACTIVE = $00000001;
5 t z4 B/ _& M' ~ } - DEVICE_STATE_UNPLUGGED = $00000002;& i# e* y) u2 c5 D+ |
- DEVICE_STATE_NOTPRESENT = $00000004;
2 R1 u! U- G1 f. f% s - DEVICE_STATEMASK_ALL = $00000007;
4 o2 ~& e, c/ v" w7 z' ~ - , w4 @7 |* r1 ?" I! E K
- type
! A/ U: n3 U& { - EDataFlow = TOleEnum;6 {. }: C# s2 J
& U S2 w4 \- E( k( f L" f7 ]- const! D" i% k( O. i* F0 w
- eRender = $00000000;! _. L6 U2 R! w& j+ ]3 E. u0 ^2 y
- eCapture = $00000001;
1 {+ r4 k; P6 H7 C+ w - eAll = $00000002;
* ~9 [* }+ H( r4 X7 ~6 N1 N0 l, ` - EDataFlow_enum_count = $00000003;) s& T9 H7 _: @: W" R$ a
" `5 z9 ?. l. j9 p2 x+ l- type8 I* ]/ m$ G) n) g0 S( K
- ERole = TOleEnum;
* [) z( G# e* I d R0 I - 2 W8 g5 r9 r v& Y+ d
- const* m% N- _/ C: W- ?7 e0 k) X# V0 f
- eConsole = $00000000;9 Q7 q+ Z" ~9 r8 B) D
- eMultimedia = $00000001;9 b s& d% U; g& u/ W9 F/ d5 ~
- eCommunications = $00000002;
8 n' _- Y% {: V9 m) i - ERole_enum_count = $00000003;
& o$ E4 t8 D- U& ^
; B4 d: O2 b0 S- J- type
; |+ P& Q0 E2 u- @6 U& h - IAudioEndpointVolumeCallback = interface(IUnknown)0 A8 h2 X/ D$ q
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
2 y5 z* \6 V- B; _3 @8 ^ - end;
- J3 x0 j# A7 s4 [0 J, D7 q' I
0 q8 H) A6 Q! z5 l! N- IAudioEndpointVolume = interface(IUnknown)
2 |+ V o) R$ x/ O$ f) l3 X) b$ R - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
: O6 D9 @0 l+ D/ `8 B4 C - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
* g6 t) E3 m& ~+ M; I, J - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
/ V' e c) b" O% m6 z0 m - function GetChannelCount(out PInteger): Integer; stdcall;2 E1 ?4 [5 A, ^& b: K! M6 ^
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
# p: f7 w+ k! R - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;/ [/ X$ {* b4 T! i6 f3 R
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
7 O: B$ [0 s$ v! n& c0 X - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;( w z: m+ \) h! G
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
. |4 V+ F! S2 I7 k- n - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;* c6 t9 v& {6 Z: r: c8 Z+ R
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
% U* a$ O' p- ^5 F; y& V - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;' V- T& ~' @& u$ E
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;. b2 M9 ]8 ?3 Q" V
- function GetMute(out bMute: Boolean): Integer; stdcall;2 M1 [4 @9 }" o/ I
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
* P% H+ }' X4 t3 x! p4 P - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;& ^6 X' A( v- ^6 N
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
$ Y! y! P! a6 o - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
0 |9 B" y k5 N- g5 \$ m! h5 p - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;8 S5 X6 _5 W! r. O, d
- end;
1 l1 z) E: A; D( S: d; q6 m - $ U8 y A4 n- c
- IAudioMeterInformation = interface(IUnknown)
" a7 w& ?1 Q: T - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
( i- n7 Z# J' Z - end;( ^" {+ t$ u" m# X& V
- ) O0 L8 L% v% a) L% p) _0 J
- IPropertyStore = interface(IUnknown)
6 M9 L) C) c& g' O3 p8 {' ^! ] - end;
9 W' H$ A0 `0 O3 E* [- I. @6 [
6 N/ f7 v5 ^& ]- ?- IMMDevice = interface(IUnknown)
2 P* ?1 r, ]7 X: C! J2 P# X - ['{D666063F-1587-4E43-81F1-B948E807363F}']1 ?2 P, R* [& P) I- H% K- x2 s+ B
- function Activate(const refId: TGUID;
) l8 R5 j; c- q8 E7 b7 b* r/ |! z - dwClsCtx: DWORD;
$ }. S& L$ d" J% \" n# V - pActivationParams: PInteger;/ n8 J: ]% Z# y, o, B
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
+ K% s+ M$ H* b' |" Z - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;$ x* Z! \ {. X0 J0 a. T
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;, j [6 O7 g4 w2 Y$ y7 Q
- function GetState(out State: Integer): Hresult; stdcall;4 }+ t7 d9 ~. M2 n# k/ m& n* T
- end;
% g" G6 G- r9 `3 C1 c3 c
1 g" g" E2 U0 y" a7 m
* n& A2 R/ l0 b4 Q" L6 e5 z- IMMDeviceCollection = interface(IUnknown)
; `$ Y1 f1 I8 x* T - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']3 P2 y# a9 l% m! ^' b0 E
- end;
) q/ o- u$ g& Q* A2 |8 t# N( B
: J1 L L; ]/ S* n0 i& y8 _9 V1 {- IMMNotificationClient = interface(IUnknown)
! R2 X+ v0 z0 S - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']) V- {6 ?& p4 |( f* T
- end;- b% ^9 |- c* T) ~1 R0 Q
- & H+ R/ U5 o- Z$ L- M3 j
- IMMDeviceEnumerator = interface(IUnknown)
2 W4 [" o5 U$ k; f - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']: U" @: T' h) q7 ^7 [) ?
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
0 _# t- ?4 X8 S3 d% w - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;& Y: W0 `2 @- C, _6 ?* i# W! c( H
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;+ S# z; B. X; H% s$ ]
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;0 n8 b# h) X( t' r& F
- end;
/ O4 N9 N! [- Y/ _. b
. [8 B8 P8 _# [0 \) z- implementation
4 t2 f8 f/ }6 B8 d' c; m; V
/ B4 q5 l6 ~+ z) W x- end.4 C4 T# t% l: i( x. X; g6 @ |
- 4 ^1 v* U+ b; Y" \, `( F& p
- //////////////////////// P/ J+ J# I Z1 @8 f4 O
- simple sample :) W# Y; `# ~' g4 x9 q; j& P: g
- ///////////////////////
4 i7 E7 E$ `7 h* n - # ]- J7 g$ z4 T' U' z
- //...... other code
5 o* V7 G C6 _' A4 O - + G" X2 R9 P$ Z% `3 Q% ?6 Z; Z
- uses ... ActiveX, MMDevApi, ...;, i/ ?: P2 ^7 d
- : v/ v, `* v7 G5 K$ f( W
- //...... other code
! o5 e! |' ~: b" o" g% Y
: H$ C9 H# a! _9 x+ |- var
/ p2 S& b; w2 w+ |7 [ - endpointVolume: IAudioEndpointVolume = nil;* y5 K: i) h3 | o5 E
# {- |/ f4 x; o' V- procedure TForm1.FormCreate(Sender: TObject);
& S6 m2 Q, F0 e Z" u7 E - var
+ |. H- h; A& D- U2 U% ^ - deviceEnumerator: IMMDeviceEnumerator;4 }: j# B& t v2 j
- defaultDevice: IMMDevice;+ R0 u- n4 a2 A+ ]( D$ }1 G9 y
- begin% N$ S/ V. o9 v7 v
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
3 b! _, I+ I6 j0 C4 Y( o - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
( W# {- U+ v4 q$ |, a - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
) P" V7 M$ i9 {/ H0 c7 u - end;9 y; w. N' W$ v! l7 K
( D# @1 e$ i. p6 H- M- I- procedure TForm1.Button1Click(Sender: TObject);
0 o6 P/ C7 d' B( O7 L - var
# j7 B Q3 J0 G& Q7 ` - VolumeLevel: Single;
8 L* P/ K( D! n4 ]1 W4 H+ ` - begin
/ r1 s; q# p p0 ` - if endpointVolume = nil then Exit;
0 M" M3 ^( ]. Z/ m" @ - VolumeLevel := 0.50;2 O, Z! R4 H" b* y6 H9 ]( S# l
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);$ R& u- q# K$ z" m2 Q7 c _
- Caption := Format('%1.8f', [VolumeLevel])0 T. z4 j& K& }) u
- end;4 X) G, U* j0 Y4 N
- ( y8 m% A; y) U0 A1 O4 S
- /////////////////////////////////////
$ I) d" V. s/ k4 Q$ c. ~) N
2 i8 d8 Z% h2 l4 {3 d V$ q- // with best regards ToxicDream
& C# X5 V4 S/ v
复制代码 |
|