|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058! n; e& O) S7 B- C% J
By Mukta & ToxicDream
$ f0 _ p3 D' ~( f- //for delphi 5' j: l3 A1 o1 K% C7 Z" l; \
- unit MMDevApi_tlb;
: L- s3 ?* g/ u
& i8 o' D/ Y, O& u# q: o/ w% W- interface
- O" K3 z5 f2 H4 ]# |, p - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
7 E( e% t- C$ B B& O- t9 @ - const
* `% K4 r4 t7 x( r: n8 H% ?3 I6 ^ - // TypeLibrary Major and minor versions$ i, o: L! k/ {; c
6 r: S/ s( r# c: X$ g- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';' l( @, _! U/ g9 I) x3 R: i
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
' G# G5 [2 @9 f8 D. t - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
9 D" ~2 `( u3 P - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
) c1 t( F2 Y: L% K: O/ \- ~ - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
" a, I. U+ i9 w6 C2 t - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';+ o; ^+ N) f. l% }' @0 q
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
1 O1 u" l' f% G2 x! O - 6 _" H9 i E! o) }9 U; m+ o5 o
- DEVICE_STATE_ACTIVE = $00000001;
7 w& U! B' j2 `. a# D+ W - DEVICE_STATE_UNPLUGGED = $00000002;* Q9 Q; ^) m. L3 h2 d8 N
- DEVICE_STATE_NOTPRESENT = $00000004;
4 c) F" p' k2 e# V. r - DEVICE_STATEMASK_ALL = $00000007;7 ^; W. ], i+ c( ^( j0 ] _/ H0 h+ F7 H
& l! q9 t/ w+ ?8 x- type
0 |# z% R( ~3 o: x8 v" ]- G% } D - EDataFlow = TOleEnum;
6 `7 Z; b* e* Q4 W* V - const
8 m9 T0 Z' ~" u - eRender = $00000000;
" {& y. B+ ^/ g7 e+ c - eCapture = $00000001;
- q& @ g8 U( M - eAll = $00000002;
1 ~0 L$ n* r% f) D7 G V: ~" [* O - EDataFlow_enum_count = $00000003;
6 ~9 y P d/ X7 Z1 L& l9 a* b; t - $ K9 H$ T. E- o. ` x' V& @
- type
8 q4 m6 B* G) A2 s( M - ERole = TOleEnum;# ~4 s9 \4 s* j+ | H0 W
- const3 w0 ~; e9 H- O/ O k- E. C- V0 i
- eConsole = $00000000;
~6 k5 V/ ]/ i% l( s9 B4 r) c - eMultimedia = $00000001;9 [7 s" g' O& [+ `! v
- eCommunications = $00000002;# }: V# \+ I0 w0 A# i# t
- ERole_enum_count = $00000003;9 v# W+ g( Z F( g' r1 n1 x( L: ]
, w4 z( W4 Z( Y& f- type
: |' L# A7 S9 o- g ^; J - IAudioEndpointVolumeCallback = interface(IUnknown)
8 f. y* m; g/ q# g# D5 f, o/ i - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
$ C( C6 l. P4 f9 a, v: d - end;1 f5 Y7 V( m( t) E( V5 w3 {
- * O- D# v- u Q q- V
- IMMAudioEndpointVolume = interface(IUnknown)
0 Y" ?8 ?. |5 I" o - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
& m9 u, w8 N: b8 p - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
8 y5 B+ \) F7 O' s: e" L% p - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;, n1 @' m9 M( n) r
- Function GetChannelCount(out PInteger): Integer; stdcall;
/ C5 Y1 J* k6 t0 r - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
# k# p& }) m# J' B v) f - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;- j( G# U. \4 V5 H* K' t
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;4 Z/ ]# l5 I3 K6 V# X( R
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;! ?# R6 y3 S7 V4 q# {
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
0 t7 K( v: E4 D) \ \ - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;5 r4 T' ] o5 K) C
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
7 L) |$ U6 p& f; ^2 z/ ^" Z# ~ - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
0 @: l9 ~% [! `3 Y' P& y9 U- q - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
; A& H7 M x; h% L n1 U - Function GetMute(out bMute: Boolean ) :Integer; stdcall;- `3 a' \/ k! K4 }6 f5 J
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
]; ~: q! Q: M" y - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;' H, V! b4 s' w6 B r
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;4 r1 \/ i4 S% c% S
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
% |+ |" O0 B) Y6 m/ D5 s - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall; L: d0 N$ q- }8 H; U. E
- end;' B) B! z* m9 s* c1 `; ]' K
- , V% q, \. g4 {4 g( i, w' r
- { IAudioMeterInformation = interface(IUnknown)( b( ]% ~/ t4 M! r0 T: R
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
1 X7 `. O) T: n" B$ x4 Z - end;}5 a F! h: {9 J3 [1 `
- ; S M# H# W: K* I
- IPropertyStore = interface(IUnknown)! ]) g6 s1 j k% {+ G8 l
- end;' N# F/ ?- e1 I# h5 e
- 4 b/ H8 h# c E" s* ~: k, h% t
- type
/ A- ^( V1 O! [$ [$ n - IMMDevice = interface(IUnknown)
7 R; L6 ?' W+ s) h% s4 W$ K - ['{D666063F-1587-4E43-81F1-B948E807363F}']
& @9 R) u# ?! I, M! Y - Function Activate( refId :TGUID;
0 _) Y+ ?2 @* p5 h/ M6 c - dwClsCtx: DWORD;% J, L5 T1 G' ]. w: Z- K g& Q! d
- pActivationParams: PInteger ;% L8 ^* H$ T8 h$ s& z2 ]6 V i
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;8 {" p0 R V+ S$ J' z6 Q
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;( r6 w- x# U4 @% U( r
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
" v1 s0 @6 r4 x; T - Function GetState(out State :Integer): Hresult; stdcall;
' h: S" {2 N3 I
7 V* e; x9 C, R- end;
: j* H; m' F% n# h1 X - 4 i, ]. g, p* r( ]6 T
- / z5 p: m# H( _5 _3 H% n
- IMMDeviceCollection = interface(IUnknown)
! m! @" g# b- e9 C& g. n3 ]2 z& k: d - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']# R# s2 S. k0 _1 ^" ?
- end;
, r8 x' N2 F' z+ |- G8 M - [ P8 T: _7 j9 c0 _& B
- IMMNotificationClient = interface (IUnknown)1 S" ?9 E: }7 J2 c
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
8 u7 R* o! O) k* N3 j" h" j: t/ ]7 x - end;6 e- t/ l Y; I1 g8 y
- . q* `0 [$ Z0 v' y. ^. O% F+ C
- IMMDeviceEnumerator = interface(IUnknown)( t. E% e0 p5 @1 d2 w0 `& w6 T
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']$ R7 ?9 ?3 {% ?4 |
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;& r0 q0 i v7 _; `% ~1 k# A5 ]1 k
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
/ n2 ]) Z1 _! C4 { - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;2 }( Z1 X2 g8 ]& l! V! G5 ~8 U
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;8 n4 W$ u6 U. \0 r3 J
- end;3 Q0 C7 p5 Y+ f" t
$ x' v3 c8 y7 X: `# A) A- implementation- U" q8 m( d4 R/ `; B- g
- end.
7 o, A4 _: S _ v9 v% J0 Z
% f0 B5 X+ |9 k" w" ~; X- Thanks & Reagrds,
/ r' A; \) g3 k i, ~7 I( g - Mukta ...2 m7 `. S* v3 P9 D8 N V' K
复制代码- ( Q( |+ N' n" o+ K, ?6 t. Z! I
- it's work in Delphi 7
( l+ @* d! n& L8 S - //////////////////////////
; G" R9 I* @& d6 T4 W
, @' Y. ]5 G; b$ v- c- unit MMDevApi;
) U: A5 d+ _* C/ T9 F
; G! D# ~3 R7 a. l- interface% g5 C4 |- z7 a% b
- 6 h# a" K% z8 c) D$ W
- uses- G+ B N* [5 Q: z$ R+ T
- Windows, ActiveX, ComObj;' A+ Q* V5 D2 g7 R" k
! ]/ V3 G; T* r6 P. m w- const- I/ f# }5 r% u; q# ^& R
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
% j6 \# y* v" T% j% M5 ~+ }2 \ - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
% ^3 k9 u) U- k2 n7 Z - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';" @$ p2 ^( r, G
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
- O7 f! b# p6 }) ?; M0 G - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';; ?( G( G+ R) ?) q' g4 {
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';# U5 ?/ V- e) u/ p+ t) w8 p) u1 w9 _
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';# x# D8 N; \/ G$ K0 ~
/ L$ W- h: N( z' I- DEVICE_STATE_ACTIVE = $00000001;$ P- R7 C; d& {5 R2 `. I- U
- DEVICE_STATE_UNPLUGGED = $00000002;
. C+ }- ?$ k% R2 K- J2 ` - DEVICE_STATE_NOTPRESENT = $00000004;3 V; R1 T" P9 V, r' v
- DEVICE_STATEMASK_ALL = $00000007;, x* T' Q7 M2 {9 {; ]. c! J+ u9 t% d
5 x- L- m: c% Y! p; Q+ U/ J- type
0 {1 C9 g n- `! e3 o* ^ - EDataFlow = TOleEnum;+ ?* {# f% x2 B+ |- e, S: A
- 8 i* ]- w6 U% }0 E
- const
, M* A) d7 S# M+ J3 `. ^0 V B B - eRender = $00000000;# E5 z/ Q( C& G
- eCapture = $00000001;
; a! V, y5 \( w3 O' _: ~" ` - eAll = $00000002;
6 b0 K& {+ {: c/ }4 n) D - EDataFlow_enum_count = $00000003;
5 @4 [ }# ~2 t0 v; ]! D - + O$ B9 [& G* `" }0 P5 ^5 m
- type1 K! R* j2 G, ]8 `# f- X3 L$ b, |
- ERole = TOleEnum;
0 G, K" Z" v S - ) @; [; ~ l* x6 p0 Y. E) v
- const7 `; R" `) r7 U) D& b
- eConsole = $00000000;( V' ?) z3 B- F t ]
- eMultimedia = $00000001;
$ S6 j, a+ x4 ^ - eCommunications = $00000002;) y# y! g8 n! q7 A
- ERole_enum_count = $00000003;, N! ^* z3 C+ H& B
- / m' i; ]0 ?8 l& v
- type/ \2 _5 f+ c" S- y7 Y
- IAudioEndpointVolumeCallback = interface(IUnknown)) {9 h1 k; W5 S5 J4 k( j7 Z8 ?+ O4 t
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']- e9 m/ Y2 _# H) \
- end;
) B3 F, G# U, ?' v
+ c2 @: f8 q; O+ Z. L% O6 Z* K9 @- IAudioEndpointVolume = interface(IUnknown)
5 e, h) ~$ W- e/ w' x3 W - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
1 G" U2 k& H5 X$ n - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;$ ?6 B+ A) j9 q# ?
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;* p: c V. Y( W3 V) j+ o6 x
- function GetChannelCount(out PInteger): Integer; stdcall;
9 j# S" o% d' e) `* R! a( {4 [: ? - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;& P7 K$ k8 k* K' r% [
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;4 H7 i2 A( }4 ?- L8 A
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
* |2 ]( M1 V6 A3 I - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;$ i1 r) F7 Q( f- t- s
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
! R0 J& u$ f/ |0 ~ - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
' @5 l( Y3 M3 g; R# v! P - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;: S, i# {, ]; x# X4 w% f0 b5 |
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;. f( @) }6 C: r1 I" a; j
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;( |7 G1 p7 F c3 w7 e
- function GetMute(out bMute: Boolean): Integer; stdcall;! r5 w. U4 P( v" o* v) L ]
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
) v9 w+ G3 S9 ?' s# Y& c - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;8 }! ?7 K- [) y! b
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;0 Y' c1 }0 H$ a* w( q9 Q
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
, E! ?5 ?0 q+ h# |7 V" \, }( A - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
! V U- s: w% B9 ^ X6 F - end;: }/ J& I# O+ }* o
; T% x1 Z; G- p# i. K- IAudioMeterInformation = interface(IUnknown)
$ K" @& i2 B9 N+ y2 L5 |: J - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']$ e; r) j) S. \( b& z
- end;( U0 y) K, s1 T; W; H; k' m
- % m, M5 r! t5 ~% L, w& u9 g8 a
- IPropertyStore = interface(IUnknown)
$ }8 ?# G, y' p9 M - end;" R" M: ^( o' Q- R
- 9 g5 H) ?( X) H6 O# D% q
- IMMDevice = interface(IUnknown)$ w# [) }, f& f }9 _+ W/ V
- ['{D666063F-1587-4E43-81F1-B948E807363F}']+ x- y" u, O/ ]' c8 ]
- function Activate(const refId: TGUID;
4 r$ q" s( P+ H/ E - dwClsCtx: DWORD;
1 T: k( B; |: c" m; { - pActivationParams: PInteger;
7 q, u1 G; ~! ~' T! E1 ] - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;! |* T2 A7 g4 u5 A* t# r g7 d
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
" p) x: W0 T2 S0 F" k; e% b! J - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
( {+ \1 ~, ?- V3 o+ F7 I0 z - function GetState(out State: Integer): Hresult; stdcall;: \) X4 {! D0 ~) Q* d; { @
- end;, W% @- q, D% l
. \9 T% _- p0 @ ^
1 b [% E1 j L1 r- IMMDeviceCollection = interface(IUnknown)/ D/ c) X" Q0 S; B5 ^
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']3 ^! d7 J( \) M8 w& c c0 B6 ~& |
- end;
& q& G$ H2 N9 q$ k, ] - : X4 w1 @4 P& f' g2 }
- IMMNotificationClient = interface(IUnknown)3 s5 L6 o+ O- {7 P) Q" K1 x% m
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']% j% i7 Q l6 \3 E) y+ K
- end;
$ h2 W. G6 L0 {5 `% _, L
. @/ P- A3 v- R; m4 }; Z: X- IMMDeviceEnumerator = interface(IUnknown)$ X# P+ r4 h8 G
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']* e( u& ~8 H, I# L4 J! C
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;0 s0 P; W0 O% d! h4 K. _9 E/ i: }
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
# \2 O8 Y3 x. h) r - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
# _' C% O2 I* x5 Q3 @+ Y( z. r - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
0 _/ ?, \' O2 K0 A4 H" A - end;
2 N: u1 I( R: U" g/ { - 3 V6 r/ A7 _2 g' \0 {+ T3 q! V$ e
- implementation
; Q3 A, h7 X5 }. B( \ - , i2 p# ?0 {% k
- end.7 L. o' [* K* d. ]
+ q! s8 ~+ m) H. @7 { m- S4 ~* s- ///////////////////////
* ~# g1 \+ s$ P - simple sample :)
, u: ~# ~) G1 G# Q4 e - ///////////////////////
) `" I( b) I% ^ ^3 M7 N - + m' B+ q; g+ Q: E
- //...... other code" f( e5 j4 V' b- D; P3 n1 E0 l
' X$ A9 K7 n% ^( R3 ~- uses ... ActiveX, MMDevApi, ...;
; x/ K4 y: {5 U& q - 7 d5 g! t4 j. I" V
- //...... other code4 S1 J1 u+ {' i4 F7 f" i3 d
- 9 F& E% Z/ z2 t) k$ g
- var
( S/ i/ ^+ B* t - endpointVolume: IAudioEndpointVolume = nil;5 M# }1 Y/ f' |
- # i% Z5 q: F) s. @8 Y! P X
- procedure TForm1.FormCreate(Sender: TObject);
3 S; r g" y% ^" ]# ~" u3 M1 V1 P0 Q - var& M* U; a! W1 U$ E* w6 a, E5 F
- deviceEnumerator: IMMDeviceEnumerator;
: [; S, u/ z6 n* I - defaultDevice: IMMDevice;
L [1 b. l" d# E, I - begin
6 x2 k& @1 D9 y! A0 v O - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
# f; ^/ U, p( S - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
5 H; @) I& r7 R - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);5 I, D6 k4 u/ w, w. }9 L; r& K' v
- end;
! o2 R8 s1 C s4 U4 K - 0 l# a* `4 w) T7 O
- procedure TForm1.Button1Click(Sender: TObject);
1 Z' z1 L/ ~! V - var
' w. ]( f9 ^0 F) V5 p1 S - VolumeLevel: Single;
8 ]' _& K% N% v, I( n* u& g3 J# G - begin0 a& E' k* h* ^$ o1 M5 m
- if endpointVolume = nil then Exit;$ H/ w5 S. [0 A4 l4 h
- VolumeLevel := 0.50;
5 G; s! S4 ^- p" `7 _( L - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil); z. q: @, X0 y0 V, X, G) _! ~
- Caption := Format('%1.8f', [VolumeLevel])
8 m9 g) q# D' |( ^7 v; x - end;
+ O, P, I* K# } {9 k
* ^* v X6 G( L4 |- /////////////////////////////////////+ o! T' R# \$ k! x! z- D! v
- 5 ~% [" C; f5 T% F6 Q4 u! E
- // with best regards ToxicDream/ \' }4 i$ g6 N X3 m* X! A
复制代码 |
|