|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058, v2 U" G2 E+ z+ L& U' M
By Mukta & ToxicDream- ) P# A7 `0 d2 T) @3 d2 ?/ x. Q
- //for delphi 5
. Q. M5 s- s$ I - unit MMDevApi_tlb;
/ I- P! C+ j" a( K) g) \, H( t
1 q, s! |% m5 L% r: D9 f- interface
: [# C' ?1 j& d4 d7 ~ - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;. d0 _* c9 Z/ L0 C* a, E. K: i
- const
1 Q, A8 e0 B/ W. _) Y4 S8 Y - // TypeLibrary Major and minor versions' R$ t! m7 i( P5 ~
- ' q9 D: g7 P! W: _
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
) r0 l1 u }' _0 X: e( n - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';; I X% e0 K0 j- D m, E
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
4 Q3 G8 w* j8 v' g, y7 y - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';3 p/ U8 K( `. p- w
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';2 E- H- v D9 C( ~0 K- K4 ~4 @
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
3 e. T1 F' z. i+ ]4 z: Z' M C - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
. t2 k' J3 l9 U( |- b - 9 {5 x. h+ H2 J" W% g7 v
- DEVICE_STATE_ACTIVE = $00000001;8 w* E# I1 n3 Z
- DEVICE_STATE_UNPLUGGED = $00000002;
' h% \5 M/ p! B3 B; G: I7 x8 f7 R - DEVICE_STATE_NOTPRESENT = $00000004;
! M; f9 l* [" a4 R - DEVICE_STATEMASK_ALL = $00000007;/ t: k7 s$ G. N
2 D& }8 u7 G8 T( F- type
0 S# j3 L( D1 y6 e/ k - EDataFlow = TOleEnum;& Q7 y% y. D2 q/ y# d
- const. r, g. l$ Y7 H' H5 Y9 ^
- eRender = $00000000;1 G6 w) [# @1 u$ H3 k
- eCapture = $00000001;% N; `. t3 E' U- S x
- eAll = $00000002;) j8 X9 s9 u0 O5 Q
- EDataFlow_enum_count = $00000003;& E2 G7 b w+ r0 [( f! [1 h: z
! h2 C$ @* v, Y6 x: L9 J; U$ u- type$ \. ~7 b' O2 P1 v* a, H& ^1 \5 d, P
- ERole = TOleEnum;8 p2 Z6 n8 k9 j# V- z
- const' [3 k: y+ u) p0 E/ z7 v
- eConsole = $00000000;
: f1 o' L6 f" |% y) } - eMultimedia = $00000001;$ g" Y, N7 k/ c4 n6 H) h
- eCommunications = $00000002;
& u1 e& B) k, @ - ERole_enum_count = $00000003;' J& y% o) P/ h) c! e9 M# [; ^
- ' t4 _( f. C5 T% i, w8 I
- type
w6 J: r4 M6 s2 C9 e+ X - IAudioEndpointVolumeCallback = interface(IUnknown)
: w# p4 C0 v/ U( K/ G - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
$ k0 H3 [! o4 p+ P- A( Z - end;
( w" K5 r& g2 Q( \0 x) b" R! Q' j
7 `! G( O+ D4 z$ T" {5 O- IMMAudioEndpointVolume = interface(IUnknown)' r8 N9 u5 D: e$ E1 |" M' `. ]
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
* A$ v+ b, u, ~( P8 P+ q' B4 d' {- } - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;0 E7 } j( f; D8 |: T
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;" y) M$ O p6 l0 G+ R/ b
- Function GetChannelCount(out PInteger): Integer; stdcall;
7 A& F# n- B" M9 c - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;7 E- K! s$ P& Z4 Y
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;+ k1 K3 O4 i. u* q
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
: F1 S( P# M! |6 O. A9 [. R - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
8 @+ k( Y0 u* y$ O - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
. H- |6 N! P. ^% ]' e - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;5 D: t+ k: Z' n0 f7 n, T0 |' {# s2 T/ s
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;# w) t- x/ @8 _
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;6 x6 f# ~: F* U. }+ d# N# R$ d
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;, {8 V8 ~- m7 h2 E" J$ R7 Q1 C# Y
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;: n6 ~ _( C9 T. K& C+ k( _6 ~
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
X- ~2 {* k: K. `; d - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;( X8 @1 W7 h, V6 g
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;% A- J H" n: q1 w
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;# R- `/ U h* K7 G5 _0 C% Z1 x( ^1 {
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;/ |" n8 m9 [! [' o- g/ @
- end;
0 H. }2 C/ j- e - ; A4 _3 j: J! c0 q6 I3 {+ G# |
- { IAudioMeterInformation = interface(IUnknown)
- F" `- R9 J- H6 [ - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
) C- X" w% d( R - end;}2 W5 y; ~& C: u, a0 `2 U
! i& U) _' @8 W- IPropertyStore = interface(IUnknown)5 M' I4 ^5 k c, Q
- end;
& X$ W" `3 Q5 Q2 j
) w( a5 s8 ?/ U( c0 F- Q- type
3 \ m% w, B9 H( ] Y# g/ s: S - IMMDevice = interface(IUnknown)
% M& D' w8 T% D6 N, ^ - ['{D666063F-1587-4E43-81F1-B948E807363F}']# `6 J( j5 ~3 x6 V8 K; P/ I
- Function Activate( refId :TGUID;
: \ o& P1 H/ p+ c& {! v; T) p - dwClsCtx: DWORD;, ^- I) d( n0 z3 O* K' _/ _
- pActivationParams: PInteger ;+ y2 m( g4 B& P
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;% S+ Q2 x! k9 A1 l
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;+ H* @4 U# X0 b3 _2 }* a- _
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;, f8 J" a1 o, ~" c. j* j
- Function GetState(out State :Integer): Hresult; stdcall;
7 R; v4 K) Z( t3 n" P8 { - i a0 ?# C, u' N3 t
- end;, j4 x# k8 G& c: ]+ R: p+ n: N
. L, p7 h6 O9 `$ d2 ?% R, v! z2 G
" i/ j0 R# P" w, _' ^- IMMDeviceCollection = interface(IUnknown)% G% J5 X% s8 D, E
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
9 W2 e3 k7 F4 V+ j - end;
0 K1 y: m+ h, F5 l$ K4 l - . k) N/ s( x0 E' ?6 ?$ J4 }
- IMMNotificationClient = interface (IUnknown)
% i" N! O+ t0 _2 s- w% y& p - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
; o$ {9 p/ N6 F2 C+ _6 Y, O! q - end;1 B: J* _4 I. a
' i8 \5 A) }7 ^4 G; }2 K2 f- IMMDeviceEnumerator = interface(IUnknown)
/ `+ R+ Y/ `0 I R - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
# v2 Q4 T+ W' Q, y. v4 L2 J - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
0 M" @& T& g( I6 V. Y2 W9 @# g - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;0 [( W7 Y" B8 b- r d8 g& \
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;, o; i) ^9 m4 O& X, ?% A. S* h
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
1 e. x5 _. E, F( @ - end;
. S8 R! m& V c# s0 ^6 h - # e, V* K: \# K. o) A
- implementation
: m) V& ?+ o; Y9 [7 H# c - end.
/ Z, b& a% p* t - ; z2 e: x2 K8 z6 f- _7 @
- Thanks & Reagrds,
% D9 o& u' g9 P0 Y - Mukta ...
$ R, @, E3 @+ O# I
复制代码
+ ~1 b9 S) \: q+ G s$ d( b- it's work in Delphi 7* p: y; M3 v2 o2 `& d
- //////////////////////////
_0 U& u' m4 i3 d1 O( m C- w
# E A; q- @# t6 t6 p- unit MMDevApi;( `2 K# a: O" S# {5 l( M4 ]
- & m- F* C4 _- V- J k
- interface/ u: ?" z1 M$ O5 v0 S+ B8 f
- m4 [& B/ c1 R1 A% Q
- uses/ ]+ w) ~) s4 T: ~, g/ ?# u
- Windows, ActiveX, ComObj;- d. Q& _$ C y. m0 f4 |( {
) N1 x* V: s3 d* ^- const
. i b' s4 |# X2 } - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';+ Z; C, _# E0 f" t7 v" S x
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
9 Y* B, |3 q: Z( y - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
* S% k, B; o( Q, E - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
. t/ v8 t$ U7 h - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';2 m- @7 Z8 q+ }) q& g" v% x
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';: L! @+ r3 R9 W7 J6 f( L
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';5 A: N( @5 V ?5 S
- 4 J7 @' x* o1 f0 i2 L9 c
- DEVICE_STATE_ACTIVE = $00000001;6 j. R7 @+ @, f. [) O
- DEVICE_STATE_UNPLUGGED = $00000002;
1 a. E) T3 |! {( f1 j( R9 P+ Q - DEVICE_STATE_NOTPRESENT = $00000004;" w& R4 c0 q2 s: G9 f; t
- DEVICE_STATEMASK_ALL = $00000007;/ o/ E9 }3 m- Z/ h) x" ?
- 6 F6 c! n( D% w
- type
7 \- L6 J" n8 [ F - EDataFlow = TOleEnum;/ Z2 k& O' J j% ?7 n0 }
- 1 _! T* p# W5 N4 P! `) j
- const
' G! R' {4 h; X/ ~6 P0 l' q) w - eRender = $00000000;
. T+ I/ W' r* C2 S( O: [ - eCapture = $00000001;- p7 U4 ?' M. Y& [/ H
- eAll = $00000002;. C$ c( J/ p8 v6 [( b6 k( l
- EDataFlow_enum_count = $00000003;. P1 {7 `. \) \) V' L% G8 d
: W5 V5 a: Y7 U0 A1 N9 Z8 @! y* o- type8 q& G: B, z* G- L; V' L) J
- ERole = TOleEnum;$ l7 s) r1 x8 q$ S' S+ q. S0 o; M
9 r7 N. H3 r, F& i+ X- const* d" C6 M x9 J
- eConsole = $00000000;. w" J6 |+ @6 s* T% H+ r% Y
- eMultimedia = $00000001;
& M' _3 A" Q; K1 i2 k. | - eCommunications = $00000002;$ q8 |) F9 n( O1 I& [, I" A2 a0 t
- ERole_enum_count = $00000003;
/ i+ C8 Y& B9 D% v9 P
! N( a+ q* x5 [7 o$ \( T- type
9 |. b: M3 D6 l5 G# P$ X2 u; e( H2 k - IAudioEndpointVolumeCallback = interface(IUnknown)
' }8 ?- ?. l. D - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']$ j' J) f) W, v: s- m3 b
- end;
9 F/ b; l) e6 b# ]/ m
" M1 m8 n6 B: x1 C8 H) E2 J% `$ X- IAudioEndpointVolume = interface(IUnknown)1 m# t- u2 M3 r% n, c
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
G, J- k8 C* m X! h - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
6 |. q; \/ G- ~$ @& _4 }0 z: N - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
: `' X. U) M8 } - function GetChannelCount(out PInteger): Integer; stdcall; }3 S, `, V$ G6 Q3 b
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;& Y6 s l( i4 M0 R' p+ |
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
0 }* R/ O: O' q - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
: O8 n% G) o7 h" \3 V# A - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
' T- C, O& i! x+ \8 {% t5 s0 j - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;! p P0 r) X7 L! V: w3 `. f0 L
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
8 d6 F: z% P8 R3 l/ Y% [( R; s5 z - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;8 Z7 Y) c8 p3 _* U8 \
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;2 c# o7 J9 C* f0 m/ K
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;5 r9 Z; w1 } g8 P2 Q9 y
- function GetMute(out bMute: Boolean): Integer; stdcall;
0 e: K: r$ @4 a2 M7 H - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;0 K; l) n3 q, Z- @& `0 N# R
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;. ^5 `7 b7 W! s' j
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;, N) Y& [0 p8 c. s
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;. N# ?8 I% b, U: V; {
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
0 a! r, i1 G% P - end;- o8 G1 G( T' O: Q. X* R& V$ D+ r. h
- / a1 B+ k$ ?: Q' u% F5 S W
- IAudioMeterInformation = interface(IUnknown)
& S7 L" R, ~$ ^: y - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
, S' q& A$ K6 |: J- K3 G, `5 ] - end;$ e7 x0 r9 g+ b& `. W W
- - v; O! U9 [ A5 y. v2 [. i
- IPropertyStore = interface(IUnknown)
# v3 b( S, j/ e* j - end;. M; E; P; S7 ]# [/ V5 \ c
O% t% l6 g+ t' F; f( Q, i- IMMDevice = interface(IUnknown)) ?' z- U+ v4 N+ ?& T2 j" P4 K
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
& S& G. q5 V, a2 v* P - function Activate(const refId: TGUID;' M6 Y- x- C1 C$ @! @ a0 M* p
- dwClsCtx: DWORD;
+ z. o, T) ]% }8 y - pActivationParams: PInteger;
) r+ U9 p# Q+ k7 m - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
" |' M5 P5 F8 B6 v( W( m - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;" [! m" A/ L d
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
' i6 M v. T2 N& C# a* \5 o - function GetState(out State: Integer): Hresult; stdcall;; V% j3 ]8 n( I9 X
- end;6 I+ |: f+ j5 d [7 e& I H
3 d6 ]! T. N' k3 C& y4 z- 0 _+ y3 q' |. w. \6 k% P
- IMMDeviceCollection = interface(IUnknown). Z2 o C$ W6 {9 Y9 q
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
6 k2 d6 J2 \8 }! ]7 Y - end;+ R: u7 }$ Q& b
" N' Q9 n3 |) ^( u- IMMNotificationClient = interface(IUnknown)
/ P+ d' s( a& P& G/ n4 n - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
& L5 N2 e- I8 v8 L. U8 R - end;) x" t; r0 B, e; c% x1 X: z
, I# [) z* u' ? ]! V- IMMDeviceEnumerator = interface(IUnknown)0 ^: ^4 X7 U8 x2 \8 N! v
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']3 [ Z' e! r2 ?
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
) }5 p, \$ `: y, Z* D4 u# ]5 v! a o - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
' l o# E2 w6 U- I - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
7 R: A$ ~5 K. X0 R& ?" o) |9 _ - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;" p/ e4 z' [0 v8 A( J. @* Y
- end;- u- O) z! V& r4 j
- q2 F2 k$ t7 {& Y
- implementation7 n, |2 N* ]' Z0 U& H2 l! r% E0 N
% i& @- D3 D+ Z- end.
r; a% ~: z( q& A2 p2 e; k/ V; Q - / h' o% q- u' c" {! Y9 q
- ///////////////////////; @1 x$ m0 E0 w2 Y0 t6 S7 G i# u
- simple sample :)
8 {$ w' ~/ w3 d+ F - ///////////////////////
7 j: n( Q% H0 x# p. }) E1 Z! S - 6 H b1 ?. a8 Y: V$ B* u4 a: R- }
- //...... other code& I, a$ b: A! H7 Y1 ^+ f
* r5 G$ }0 i# X0 x# `1 u L" b+ E- uses ... ActiveX, MMDevApi, ...;
4 [; j7 v( t: x% j; ]* d' L* Z
) ~- ]- ~( ?% z% V- D" Z/ D4 e4 E# g- T- //...... other code: T8 ]' m2 U5 E" t5 w7 |
- + X* s! c6 ]0 S2 Y( Q6 t2 s8 h. d" A
- var
# c% a* c: D6 z1 {7 _. v8 C! o - endpointVolume: IAudioEndpointVolume = nil;
0 g! {! Q3 S& E$ I
2 f4 B) w1 l4 a- procedure TForm1.FormCreate(Sender: TObject);
: a# j1 {9 q! C" ` - var0 q! \$ v+ Y' {; y9 H4 D
- deviceEnumerator: IMMDeviceEnumerator;& M1 j+ X) ^+ S* {" n/ t" P* I4 _
- defaultDevice: IMMDevice;1 c3 r: l) h6 s% H
- begin9 d% F6 K- b+ C v$ [# \0 w
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);) Y: A: P5 Q+ u7 U* [
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);* g# x6 U& \& z( l+ z5 u
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
, I- n: Z: k! V* x$ { - end;1 d. @3 o! q0 V! Y
9 N: `; Q) }( f! r X0 r4 S* s, Z( l9 S- procedure TForm1.Button1Click(Sender: TObject);# T y0 ]$ e. ^7 T
- var
$ P. e+ z8 g- R - VolumeLevel: Single;8 }$ d, ^ [4 m% o9 K3 w
- begin" @% A# D0 i, ]/ E
- if endpointVolume = nil then Exit;7 o8 R6 D/ R- x
- VolumeLevel := 0.50;1 O }5 k2 f2 e$ n) r
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
4 O! ^0 g5 N# W2 t1 \ - Caption := Format('%1.8f', [VolumeLevel])% @& F8 v! e' z' e. p8 s& V- k
- end;
% C% {$ @: h9 ^/ ?; E; n9 E
& u) K ]- K; X2 i- \6 X% L- /////////////////////////////////////: e' E: `" @- C9 q) |3 ?4 F% r9 g& Z
- : r- ^( ]/ r4 d c
- // with best regards ToxicDream- E& ?9 M' g; q9 V2 B: ]
复制代码 |
|