|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
- A. L1 p1 C6 j( ~! j, ?# uBy Mukta & ToxicDream
/ M' j; s: m5 d9 ?% Q: m: |- //for delphi 5( R4 y; |& q8 D
- unit MMDevApi_tlb;" e8 ]5 K5 N5 ^3 s& F) D
- / Q; I8 p$ W4 l# C; ?+ v3 |) k
- interface
0 p: q# u; a$ ^0 C0 Y - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;6 |! K% x# d9 S: n
- const
" }! L5 `6 n* T - // TypeLibrary Major and minor versions5 A# q' U- {+ B
- t8 w7 ?0 e, P" L' E; x" D
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
: ~8 c! f2 ]. @$ y+ \ - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';& f' K6 \! d3 p5 I- Z' [5 z3 e$ t
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
4 ?; [. ]9 M6 x - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';! B8 B; g; a& F/ M
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
0 H ^2 O' k6 a$ K; S' v# N5 J - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';) G4 p; V& Y+ c: r1 t+ l
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';. N1 W# O1 S9 j, t, b# k
- ; z: E% j- k, F: l
- DEVICE_STATE_ACTIVE = $00000001;
$ x1 |, ?$ v4 Y/ w, C9 ^) d - DEVICE_STATE_UNPLUGGED = $00000002;; ]% s/ v9 }) _% M0 U& K
- DEVICE_STATE_NOTPRESENT = $00000004;
+ K5 G8 t5 R* X; H. j& C+ A - DEVICE_STATEMASK_ALL = $00000007;3 ~8 h) S; K8 J, X7 X
- : ^' h: s4 ~4 @% y
- type2 [8 ]( i5 {: T/ Z* N, P- n
- EDataFlow = TOleEnum;
; k) b) y) D2 J4 b - const& _4 a4 u$ S1 m
- eRender = $00000000;- R/ e3 S7 q* `3 l6 p. M
- eCapture = $00000001;3 I) o* R+ [4 V0 r2 q. {) b* j
- eAll = $00000002;
: N3 b( E! Y" l' K - EDataFlow_enum_count = $00000003;
/ z/ S4 D, Y L5 P |. C9 G
* X! C+ K3 [+ R5 T8 s0 z, `- type
1 F9 V* K0 W) l) G1 s F - ERole = TOleEnum;
`, G3 Y( I% P% Q2 u - const. U, T" b% Q% j( f6 f( c3 k
- eConsole = $00000000;
3 |4 P0 I" k Z) v+ Z: B - eMultimedia = $00000001;5 {. n* W. z; Z. d2 t* F& v1 G
- eCommunications = $00000002;
G: k. R/ V8 y6 a* } - ERole_enum_count = $00000003;* q( N" v, o2 a i
- 9 b- Z8 a U- F5 R
- type
1 b3 k8 J7 X# ~ K# p - IAudioEndpointVolumeCallback = interface(IUnknown)& B1 c% g# }; _1 t! y5 O
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']! S9 S3 C# `3 U. o
- end;9 w/ G- ^) F# q# v) m
- 6 b4 |! j, |; e. a
- IMMAudioEndpointVolume = interface(IUnknown)
5 j! n) m8 _3 ]+ }% A$ H- z2 s( ` - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']! |- c3 d) A0 d3 V/ g
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
. _% @3 i) y2 [ - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;2 _2 f7 t, n; v1 ~* I- y! @# {
- Function GetChannelCount(out PInteger): Integer; stdcall;
8 z8 D6 l3 [$ m) f8 c - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
8 } y6 T6 f$ `' I0 t- ~; d - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
/ |& C# `* C. D6 F - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
7 i- j }4 d8 h; M; q - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
4 ^- K0 J4 M1 H9 N - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
, t" x6 k4 v5 ? - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;' D1 L6 _8 r; D$ z* N# n: A7 t! M P3 G
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
* W- L* n( `+ K6 E6 D - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
/ M! z4 h+ `2 E( C1 f) \ - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
. W$ L$ s2 |+ L$ M5 G5 v) N1 T - Function GetMute(out bMute: Boolean ) :Integer; stdcall;( Z: ]+ m7 ?1 Q3 _( j- h& k
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;. u2 z) _+ T; x U
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
5 p9 b* E* U# C6 \& P r, t - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
$ C: t& Y& x8 Q' \- V$ G* l - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
! e- r* ]. o' F" i% S3 ^6 U - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;: _( v, P+ |1 y2 ^; T
- end;2 O6 t9 b/ q" `( l/ d
& B6 p5 ] q6 c L; X- { IAudioMeterInformation = interface(IUnknown)5 U) C e% W$ n& Q T% B+ f
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']/ d* u2 P+ y. C8 N6 {1 D! s
- end;} X+ J' @- L' X% F
- & j! X P7 [" [# C& m' x
- IPropertyStore = interface(IUnknown)
& j) s# K3 x4 R& _8 r* G - end;6 I V7 m1 m ~, D
# Q5 Z b" X# a& G# o. J- type
; z2 M, z, j" L9 ?" m5 s - IMMDevice = interface(IUnknown)
}4 j5 V/ R1 z& t: h8 { - ['{D666063F-1587-4E43-81F1-B948E807363F}']
! Z5 v" Y$ b; y+ @ - Function Activate( refId :TGUID;
, ]4 Y; B. U$ J; l! b: ~8 T( b) C - dwClsCtx: DWORD;
. U! g( m; X2 x/ _ - pActivationParams: PInteger ;5 W" I9 A4 C+ q$ t, ?
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
. W/ U; I9 j( f - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
/ l" ]$ c$ X/ V3 ` - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;- X1 p+ M% X9 O v
- Function GetState(out State :Integer): Hresult; stdcall;
- j" y7 [6 a7 a2 B( L J; v
. K+ j# t! N) q/ T- end;9 p+ T- Y0 q2 T: i$ C9 g
- : t ^6 k8 R* h5 }* y
+ M$ p Q3 g" s; M# Y4 ~6 c- IMMDeviceCollection = interface(IUnknown)8 }. X- a7 s6 S9 ^8 O4 M
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
& p, I; d0 K5 O0 b- i - end;) t0 x5 a& H) I" w' y, m
v0 x: A/ G- N* }1 V3 K, n' r- IMMNotificationClient = interface (IUnknown)& Z5 K& L" w: C( e+ c
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']- a3 u' p6 s) \6 l
- end;
6 e. |2 c9 z# z, }3 q8 M9 H* ?
; s4 b# B4 o9 o3 G- c/ l7 A0 ]$ x$ F- IMMDeviceEnumerator = interface(IUnknown)- h6 ]' z, Y N$ k3 ~
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']8 _! p. f8 r6 {! e3 m* u" A4 v) O) ^) g
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;) P2 M, ~. q& C( e$ t) e
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;9 Z( K7 y7 ]0 U( T0 |5 C# W
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;0 f3 a+ {' `0 a* v) a
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;6 B. T% \! j$ o1 | x
- end;- m- k2 b |* S8 Y; x, M. f
% L! s* x, E2 J: V, N+ C/ ~& d- implementation
4 @; f4 ~1 a% [# f; u7 e - end.
' J" T* N+ a' j. G' n+ @; e" r' J - / s/ a6 Y* e9 O9 Q. L
- Thanks & Reagrds,# I* [: }0 t9 P& X* H! f+ e# p
- Mukta ...
3 `4 _: h8 ~5 E! M; B( u
复制代码- * }+ A( n- e+ T$ _; z4 {0 x
- it's work in Delphi 7/ S% l+ C3 Z' S/ m. R* a
- //////////////////////////
: s( C# |! c( M; o - - h k& N) L) ]# ?0 \
- unit MMDevApi;
. o$ o+ e; [$ v7 I9 }& g - , ^2 ~; c4 v* A& G, j: ?( L* W
- interface& }' ^7 y/ E; f5 s0 T6 M2 d) A0 [
- + J# F7 X+ l4 N* J2 i k
- uses7 P! T0 k% x1 l' \: K3 R
- Windows, ActiveX, ComObj;! b4 {( V' C9 ?2 f4 C/ a6 e' V
/ d9 }5 s6 c5 s' }' y8 ^- const
1 u j) g+ Q4 U* k! L - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';, @) J$ s" k8 e$ E; Y
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';! V& e) m0 D7 P' m4 r
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';$ x) v) k( @9 c% S6 n; Y$ m
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
3 b1 D, f* d/ i& a - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
6 e8 S6 r' b# I3 C6 S - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
2 J" M: O0 `+ g - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';! u& q& q% e, Q; |7 M( @
- 3 T2 S( z) |) ?7 h; a z; Y
- DEVICE_STATE_ACTIVE = $00000001;
! W0 v, s0 u# @/ ^; J. } - DEVICE_STATE_UNPLUGGED = $00000002;
' ]+ W* J' P, a/ D6 Z - DEVICE_STATE_NOTPRESENT = $00000004;: S! X# _0 s! j. q& s- O! @
- DEVICE_STATEMASK_ALL = $00000007;
: g$ O8 s0 _- k$ b% z( l - R5 q) s; p0 s# G1 R
- type
% N0 A* Q6 }$ p - EDataFlow = TOleEnum;6 P- H- p) F ]* C& h. I5 s
- 6 |/ R* v8 p* w1 f: u) s8 k( _
- const
' ~$ W- d- [3 \1 \9 @# T - eRender = $00000000;8 R- u* j- G3 n
- eCapture = $00000001; Z E! Y) p. H" S
- eAll = $00000002;
% z0 ~$ ^; s/ [ X' N( s - EDataFlow_enum_count = $00000003;8 |( G* w9 t, B( A) _6 ~6 Z
- # L) ~* m7 t# w8 y0 ^. j8 M
- type
7 A4 E& I+ ~! a% y- k7 m* C - ERole = TOleEnum;4 B% ?# D0 N L) S& N
- 9 G2 A9 ]7 A6 s$ e
- const$ v3 T$ |2 M& _- k: e
- eConsole = $00000000;
% F: U( I# y: V3 ]8 k$ f& A U - eMultimedia = $00000001;
' g, o) Q' _% g - eCommunications = $00000002;! i, |# q8 C4 |2 n/ c
- ERole_enum_count = $00000003;' u% |) E( J! i" d1 U& n6 d
( e# p J3 `7 w. A c# e$ M) H3 ~- type
& a3 h$ K' L/ @: b) @, _: N' C7 n - IAudioEndpointVolumeCallback = interface(IUnknown)0 w, Q! N( ?4 F$ u' }8 B9 H7 ^
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']: A% l9 b( x- Q& H" n' O
- end;
6 w* E1 D6 i8 x' {7 d - / t: _* x6 R% \) \8 [
- IAudioEndpointVolume = interface(IUnknown)- h; B$ P- S4 h6 B
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']5 _% J! X/ G+ V7 E5 V
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;: x, I9 u5 n0 L: _
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
( H. R8 T1 Q# q1 }9 J - function GetChannelCount(out PInteger): Integer; stdcall;$ s/ U O) @, V9 [
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
O3 }8 z! ~' X8 ` - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
$ I: e5 z/ G1 ]! i - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;; i& Z, Q& K) a' j7 D
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;" c0 A1 `% g5 A2 q6 i
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;' O* K) J/ p7 r& U, G
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
6 F* H* E4 J+ V. v9 s4 o! u1 q - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
. P- N, K5 @ e$ s, F- Z: {; P9 Q - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
+ ?1 F% a* Y2 B3 g0 Q - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;8 A- Z1 j# m) N3 `0 E; h
- function GetMute(out bMute: Boolean): Integer; stdcall;# t; r f! K# x: U4 c
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;! N4 v5 h1 B0 ?9 M8 j4 i& ]# Z1 @! z
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;9 t* Y" c* Y+ _) j3 R
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;1 W4 H+ A* v3 y8 q
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
: s; J& A; O4 K2 X* U - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;: S0 H& v J$ {5 X: |
- end;
, ]4 U0 M, O# H - - X4 P+ @$ G M2 g. j5 F
- IAudioMeterInformation = interface(IUnknown)
9 `- x5 o7 F4 I+ i3 U# { - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
& \, v) I1 r1 }. Y5 v+ R( H N - end;2 p% p* P$ I) h: v5 D S
- ; N9 Q" i" g2 T5 \/ _
- IPropertyStore = interface(IUnknown)6 N& i1 U& Z6 P* g( I0 ?
- end;8 P2 G, w0 x M4 S
- , i$ f! g; t( O" {
- IMMDevice = interface(IUnknown)2 {3 y3 ~/ j, Q8 k- t, j
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
" O7 N+ y# Y' n) r. }, U1 c4 M - function Activate(const refId: TGUID;/ B4 P3 L* X! U: Q" _2 ]' B4 s1 I3 z) D
- dwClsCtx: DWORD;5 ^' C4 n0 e% M# I5 E
- pActivationParams: PInteger;
) n) v$ j" F' G8 \" s/ B3 ? - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
& w: B0 A" J7 ~0 N - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
! G! P) I! V3 n F - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
9 j6 ~ O- E! m1 K' h: i$ B3 z4 K2 T - function GetState(out State: Integer): Hresult; stdcall;
1 {6 _7 C+ w) H; ?4 z - end;
2 S6 P: o/ j! |# T! e$ S+ \5 d
/ \- c/ E5 Q$ e7 F' n9 R
8 r P" N8 m( |# X- IMMDeviceCollection = interface(IUnknown)
. J4 W6 L. s- z+ I! H - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
( R) u- l4 Q8 t2 h' e/ F8 n0 c - end;5 Y6 m. l, P# Y* i7 ?0 t! s
- 2 R d& b/ D' z4 Y+ N6 S
- IMMNotificationClient = interface(IUnknown)( n& I% @1 v' E" ^
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']1 O* m+ s; J- _. Y
- end;
6 c3 O' Z5 j( Z5 ^
. @: w* j' v3 d. S% g! o- IMMDeviceEnumerator = interface(IUnknown)
7 K3 ^! A- e+ j - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']! n" i3 V# j6 s& L4 e4 C) i
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
. b5 {- c+ ]) K5 x" x. ~. u - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
/ {9 ?+ W* Z( k$ X# b2 d - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
0 [' b* Q% h b9 ~* e* V - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;3 C: V( N. r! g1 t0 Z0 p( {! U8 h
- end;2 Q+ R$ H- Z+ w+ g3 u
; X6 l# S* x( w: a* _3 |, E. Y- implementation
0 ? v3 u! O/ R6 T" ?1 c: v - + k6 c# U8 B+ v3 A
- end.+ f/ H. w/ Q. q( k. Y, a
' l+ l/ \+ c9 m7 B: f0 [- ///////////////////////. e( h. G6 f1 t! b
- simple sample :)1 F7 P3 u5 b/ t: j7 H) k4 V ^
- ///////////////////////. w' m0 m5 b0 r+ Z1 h$ r
- & i. e# n" u4 |# W' y$ ~* ?% p% P) S
- //...... other code
5 C `7 P& w9 z P) M, B- G
; x5 A- {$ d0 D- v- uses ... ActiveX, MMDevApi, ...;' h9 J; D7 z9 L' P
- 4 m: S/ Q/ c" M7 ~: U; c
- //...... other code0 b g4 g* e3 E, ]
- : \, U% X( G3 J& @) v3 N& x
- var/ ~% K: _' b6 W' y
- endpointVolume: IAudioEndpointVolume = nil;
$ d( ^" b5 f0 C/ {5 j4 W - 5 N7 V$ I ? X- |( n
- procedure TForm1.FormCreate(Sender: TObject);
4 G& @/ V7 F! A- p9 h* B" a, G2 s - var
7 a4 B. o$ y* y8 u - deviceEnumerator: IMMDeviceEnumerator;. Q& p# I4 ]$ S
- defaultDevice: IMMDevice;& J4 w: t6 c+ U5 G. Z5 O) t4 p( x
- begin
3 u0 c: F- t* G C5 N& @; ?. \ - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
9 C2 O0 I1 F |: M+ w6 N# D# D! \ - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
- Q" n6 @2 P( h# ?2 T3 i - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);' ?6 j+ R$ x6 ?/ H: a3 L+ ]3 Z5 J! ?% K
- end;
7 F4 ?' \4 `* B( R - 1 G1 d3 {' `9 U3 f: m
- procedure TForm1.Button1Click(Sender: TObject);4 z. i6 ~# F3 f X; I$ \6 F. M
- var% y( V' i! V! F$ @0 H" M
- VolumeLevel: Single;. f8 N& @4 m- i0 P; K" s* @
- begin
3 T" _8 x: S: ^- J c - if endpointVolume = nil then Exit;9 A+ V1 M% k5 H# ?; ?! L
- VolumeLevel := 0.50;
2 S1 V1 U9 D3 E) h: J ]' X - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);4 Q$ r; E0 `6 c3 S6 e
- Caption := Format('%1.8f', [VolumeLevel])2 j& d" d5 G! Q
- end;! G: ], D3 ?# a+ E a4 e
- 6 u$ i: u( o% \. X3 i
- /////////////////////////////////////
+ S7 Y2 X. S$ B+ z& ?0 y: k( f8 ` - , T/ j/ d, s& U+ J' j4 Y
- // with best regards ToxicDream5 ^2 L1 d F! [! A! I
复制代码 |
|