|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058, M7 e8 l' B" U- b( ]
By Mukta & ToxicDream- 2 V& Z/ P5 w$ h0 v, `, c2 {8 {
- //for delphi 55 s- k, I2 j$ v
- unit MMDevApi_tlb;
$ K* K+ T* Q! }
4 b9 b1 N- Z* z# }! c1 P- interface5 h/ T2 Q& d7 B1 G
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
7 q# q. a8 W. e0 H - const8 _" O& W( b( Z0 b
- // TypeLibrary Major and minor versions
* |: y3 b9 L3 y3 x0 F - * C0 X; A ]( s
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';6 ?$ g1 ~% V5 O8 ]- W8 c, I
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
1 {5 T; N( w8 z, S+ Q! ^* } - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
1 b4 Z8 S8 r2 y+ p" h7 l - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';( d& N, e6 n8 [- C9 J, O8 x% d! x1 Q
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';7 k! ^& C4 @* k- C y% t5 b* i
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
% D6 j( z/ c- x3 R$ j - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
! c- c! M; G# Q - % ]1 w: C& M7 A$ `+ x- p
- DEVICE_STATE_ACTIVE = $00000001;
( m' ~. A5 {* W, e1 N; N1 {# F. u - DEVICE_STATE_UNPLUGGED = $00000002;' Y6 q2 R. d7 n2 b! w
- DEVICE_STATE_NOTPRESENT = $00000004;2 W% r' V& k4 T
- DEVICE_STATEMASK_ALL = $00000007; Z: `& u& h8 t0 I" Q
- / V7 S, l) d) ~2 b/ B3 T5 O
- type/ K+ _3 u! }# Q0 @) {2 V$ `- ~
- EDataFlow = TOleEnum;" Y" G% J8 y: F8 w/ D# _+ x% I0 k
- const
9 K6 R- l; c! z) @$ V# @ - eRender = $00000000;0 i- C6 W, ^2 ~
- eCapture = $00000001;+ B& J" a2 @1 g' v4 W# M9 ~/ j" s
- eAll = $00000002;$ n5 \' B* U' V, ^+ l
- EDataFlow_enum_count = $00000003;& @0 O( z, {- O. i
- C9 @0 y+ n* {1 V0 h
- type
( D' c' U9 ]" A' W - ERole = TOleEnum;: h: j8 I/ |" _0 C% j3 z& ~
- const
; K9 U! v: j) i' p* } - eConsole = $00000000;
1 ?5 h* N, f$ j9 Z7 l3 h' U - eMultimedia = $00000001;
6 R3 J% ? `$ [* G& [& ? - eCommunications = $00000002;
, K3 ?4 N6 z) D- v+ s - ERole_enum_count = $00000003;
2 k! Y) J1 h. c( A' e9 L7 D* H
# P2 l1 i. X' b! r; M- type
. [1 o* r0 a! e+ `" B$ N - IAudioEndpointVolumeCallback = interface(IUnknown)
% b2 c" i1 A3 o - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
. U( e$ P4 q7 i2 W8 | - end;+ l6 x+ V* {- X
9 \/ i9 `) X8 T" B. x r- IMMAudioEndpointVolume = interface(IUnknown)1 p4 ~/ y7 s+ ]2 s' t1 K V
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']9 D' b& F) C: [9 J
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;# ]+ X5 ~, t4 l
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;# O8 {3 H+ U& B- B+ ?
- Function GetChannelCount(out PInteger): Integer; stdcall;9 T8 s2 |- d; p& [ r$ p& M8 h
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;" T M! | }! ^0 W& }: h: b
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;- F3 E9 J% D) ^" T7 Z5 k0 A
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
! r* S9 T# r6 [& h! D - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;* r4 E& X2 I; H% e& m- ^
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;; ], f' A* ^0 P2 v8 N
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;5 @* n- M; ?/ |7 @4 `/ U
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;% L5 o. n* I1 s
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;& R# z& H# j" Y* Z3 x5 Q
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;; @2 D7 I) i- T7 i
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;0 d3 Z7 n$ O. y `# T# }
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;; i9 u7 n0 C; i" W& ^
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;9 Z- A" I- M+ b0 ]4 t
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
6 u6 L6 B: A' n8 ?9 M/ l - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
6 c6 N9 J( l( C+ D4 V - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
7 B" ]' \$ A; n2 U - end;/ @& j0 c* G+ j: W5 V0 D! B% \9 e
- 8 R- Y$ M/ @! w) ]8 @& M
- { IAudioMeterInformation = interface(IUnknown). K+ e( z& W! i# X7 N6 K- Q
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']) {/ R/ Q& F2 a" }( A9 z
- end;}
- b9 Q3 Q1 s0 w% @' Q
5 s: Y0 p" M* _1 T8 C1 r, j- IPropertyStore = interface(IUnknown)8 ?$ f `! S- m; u: I
- end;
% {8 U, f% Z2 w( n, | - 3 i% u8 z5 X5 e J
- type- F o; c/ \2 Z
- IMMDevice = interface(IUnknown)& {6 b: U3 H) ]( O
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
4 W2 w8 y( O' @5 O% t- Y/ ] - Function Activate( refId :TGUID;
# [ B5 m( ~6 z - dwClsCtx: DWORD;
6 s5 Y. W; a. c( B6 N - pActivationParams: PInteger ;. l7 C1 o9 b9 S5 T1 \' g: j
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
8 G' u% n( |5 y3 }3 I& f& Y4 k - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
. r% S7 v2 C5 [0 \' H# | - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
5 i% b3 Q: ?8 O6 B- q - Function GetState(out State :Integer): Hresult; stdcall;
4 ?; x3 X3 x1 G; ?1 b - $ v. S. J6 k( I* ~
- end;
8 }8 s) I7 u: o3 [3 O: U - 5 O6 K' C+ ?8 d3 ?& m8 Z
+ z8 [5 w9 s2 l, f/ D( t, K- IMMDeviceCollection = interface(IUnknown)
. P& Z, C/ k1 b: R3 f) w% E1 F - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
, s. W! i- V" `* \6 u+ b t/ d - end;
# x% {! C2 v) S! x5 H
2 h$ I) e2 h1 g' B( K. A- IMMNotificationClient = interface (IUnknown)
5 j! x# p+ m# Y1 F3 j. o - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
; Y3 @" v& s1 g9 Q- k6 h - end;/ m i4 L: T. r
' b; F, h1 i5 Q' b8 t2 k- IMMDeviceEnumerator = interface(IUnknown)
( ~2 w! N( f/ `! W - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']3 c3 ^* |# P! ~7 g
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;' u& Y2 @9 S3 e7 z% S$ i* E/ N' w0 S
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;7 X: z. }7 r( q D
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;( d1 y n: t2 _* F m
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;% _" C( `9 D2 `
- end;
+ e/ G+ D1 q/ U# ` - 4 j8 e# |+ K" A" @ u2 b, u- n. [
- implementation
3 S% ?: b' X/ Y - end.
* N9 T. G/ M0 }2 D" w2 l' x
1 a' b5 L# k' ^( j7 z1 T4 T5 T- Thanks & Reagrds,4 r* x J$ d$ m' l
- Mukta ...
! R1 T# P* ? P* |" _9 U6 s" Z
复制代码
& s2 U; {, S# a* q0 v0 y- it's work in Delphi 7" s) J( e) ]: T4 [8 I' F6 _3 }
- //////////////////////////4 G; H$ u, c4 M* T+ u0 p
- p9 |5 N D3 U' v0 _0 T8 @9 r& Y
- unit MMDevApi;
7 r! d( E+ q# u9 z* R
* x" ?: L; ^& m6 X( a6 g1 c- interface
# p* \) D, v- B' q& ]$ i3 y9 O
q2 {$ e3 }3 l; @% [% d- uses
M) P( ^. }# V4 B: S" X+ L- C0 ? - Windows, ActiveX, ComObj;
5 F* \9 O1 [% ?& y. t+ f6 \
$ G. a8 y$ t* D" d- const
% r2 V! D6 X7 X. ~ }" M - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
$ O, T' \" t, r - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}'; ~! y$ n& R" }* [- |
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';$ o I+ t# m- T" r/ w4 T; \5 j" f+ k9 [
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
. P6 r4 e: L+ r# ?( W1 g8 o; b - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
" D. {$ y+ Q) G+ x+ A+ G7 q3 S4 C - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
( L8 \& o: g% |& K - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
4 K5 _- T! ~( m. n( x1 S
. @0 F& X4 ?" E& O) |+ Z- DEVICE_STATE_ACTIVE = $00000001;
9 N0 R N/ S! j$ v, t - DEVICE_STATE_UNPLUGGED = $00000002;4 S, O1 V# j; E7 M9 Y, U
- DEVICE_STATE_NOTPRESENT = $00000004;/ ^+ Z- l) G# G5 x1 Z; @" Y5 w' g
- DEVICE_STATEMASK_ALL = $00000007;
1 \. C C$ t" w; ]* ^6 g - # R6 _5 l9 ^6 V/ E8 s6 A* e, z
- type
2 B, x) a Z7 Q" e - EDataFlow = TOleEnum;: ]8 N( x( c. J; |7 e0 ?6 Y, v
- % [1 \- j: ?3 {9 ^! q" \
- const2 {1 h* e7 h" w0 S; z1 b
- eRender = $00000000;
% o8 ~& d9 J, L- \2 W4 B - eCapture = $00000001;# J% n# ?! ]2 z) V
- eAll = $00000002;5 }! i- U7 r) U9 W8 r& R
- EDataFlow_enum_count = $00000003;* ~7 m/ M' E% i1 V# q! [3 `9 y
# T* k+ @2 M1 g3 x' ?/ t- type
7 e" t' j0 y( z - ERole = TOleEnum;
; d2 U/ v2 o" x: W3 C6 V" T/ H - ; O D4 w; K% E c/ S" p/ A
- const* L& j: z6 Z. k; n
- eConsole = $00000000;% C' `/ b- O6 T+ ~+ ~% |8 k8 g
- eMultimedia = $00000001;
% d* K8 P& v$ R5 Q( F - eCommunications = $00000002;
# | C. W7 [) S% p; G - ERole_enum_count = $00000003;5 c7 V% b8 }5 [5 L- f* K
0 E% K9 i; r" ^0 L& i' ~- type
$ |0 r. V- ~- d8 I5 i, S, b - IAudioEndpointVolumeCallback = interface(IUnknown)
( Q3 ]( F5 T( }4 w0 Y( E/ h! f - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
" o/ K( C" F! R! s. `7 `& u - end;% N, u9 @* I9 d) O) e
- : y) z" X) F. M
- IAudioEndpointVolume = interface(IUnknown)5 M" @7 N% |2 c
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']- _+ r* S+ C3 Z& H, x u
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
5 \' W9 N5 ~/ D: R4 c5 p5 R! M - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;+ c, j$ S' ^6 A1 b5 w
- function GetChannelCount(out PInteger): Integer; stdcall;
- R- S- f7 s+ x, ? - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;+ T6 [8 d& `" L g* E" f0 J& m
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;7 |& n! ]9 o4 K# p0 f# Q
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
2 T& M, _5 d1 y& ^6 _& h4 X5 } - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
% O& @" D( F# c- R - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
7 G0 I7 v4 Z' ~- C* k - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
. q5 ~3 E5 d7 M" |3 q+ _ - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;& h3 T$ k5 X# b9 ?
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;1 I3 c4 t' y8 F# G
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
, T l/ n- m- ?# ?. b' S- n) } - function GetMute(out bMute: Boolean): Integer; stdcall;
) j G- C5 X% U$ @" ?$ M7 A& b - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;0 D9 s# O; y; n6 y
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
% F) p: [/ O- [' T5 ?# ?3 G - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
/ b, r$ _: p* T, T9 M0 }/ ? - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;1 d' g, \+ ^8 ~1 ]" ?. B
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
9 x6 W7 H7 ^( h" n2 C$ e! N& p - end;
! a% Z$ A M$ l- b6 B - 4 d1 L" K) r8 F. O
- IAudioMeterInformation = interface(IUnknown)2 N2 H0 s$ j- L# ^! u
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']0 x) h& o, ]& R5 E
- end;- C' A. s- l2 ^
) I/ I7 J4 z3 j9 }( ]8 y7 B- IPropertyStore = interface(IUnknown)
, D9 e- C& f! @: Z. N" B - end;9 A* T2 {& S/ X, z1 z
- ; L4 z) s. G( ^; T ]! C7 N$ m( J
- IMMDevice = interface(IUnknown)0 k. e5 T; y, d- T
- ['{D666063F-1587-4E43-81F1-B948E807363F}']; } x8 ]8 D7 R! q, [2 X
- function Activate(const refId: TGUID;4 }: Y k, ]9 ]+ m- G0 |+ x5 Q) F
- dwClsCtx: DWORD;
- d5 D( l' t4 {$ @7 } - pActivationParams: PInteger;# J! L) }. Q t$ q' g$ G
- out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;# n" u# v8 R" W. K; ^' z, t: V
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;! F8 P/ s2 T) M4 l6 Z, ~
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;' t8 x# u- `! r7 a5 G9 m
- function GetState(out State: Integer): Hresult; stdcall;
9 B' k1 r" l/ |* d - end;
% S9 o4 ?. x; M2 o5 d - 1 t( b" |- p; d' E
- 0 ~) A3 s, ?# `, F6 H0 M
- IMMDeviceCollection = interface(IUnknown)( t/ _; [( ^8 y$ ]& c
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
G, z$ z' z* b% g' o - end;/ c2 A& a' k# ^$ [+ H
- 5 D. F1 k, k8 d5 T1 u) K9 G: ?9 v
- IMMNotificationClient = interface(IUnknown)7 O" C5 f G) K! N0 O$ T
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']$ x# W- `1 Z3 n8 c' w5 |8 i
- end;8 V, E! w7 l5 X
- + Q; g& ]2 N5 F- Z$ \
- IMMDeviceEnumerator = interface(IUnknown)% I, o# Z( T1 [+ W
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
: z/ E! G# L1 Y - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;$ b, H% Z4 H0 j' F" s$ K
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
+ j) g. l( v7 ~ B5 U1 U! t - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;8 B7 n+ K1 B2 ^2 [
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;7 V+ _: O) Y' Q' n0 ^- X" m& ~# q! H5 @+ m
- end;" a$ }$ P& d0 r# `* l
% T% @. N* w% @# s, R% J) J" F- implementation
. ?2 t9 o. m2 \ - : s* A3 M4 V; i1 y9 C
- end.
% B7 t- L }7 ^" s5 Z3 U - $ b5 C& v% L3 G* m
- ///////////////////////) y3 d5 [. L* s2 g* R3 f! A
- simple sample :)
* O- ]( J- n( ~# v7 ]0 T( a2 U - ///////////////////////
( T9 l+ d, A6 Q8 V - ! m: w' q! o4 S/ L
- //...... other code/ y3 V3 z) k2 W2 j! C
! @9 n- M/ w7 G1 j* [- uses ... ActiveX, MMDevApi, ...;
' y, }+ s: O, f" {5 E - " F) d. x7 m* n4 \/ R9 }
- //...... other code
% H# H; Z4 s2 r( g* H
9 T0 o* Q G$ \9 S- var
( W2 h% c& g j; R) y0 Y O N+ w - endpointVolume: IAudioEndpointVolume = nil;- \" F$ C. l8 l w9 V
8 r$ Q9 k. o$ I A6 g# r- _3 f/ P- procedure TForm1.FormCreate(Sender: TObject);" A& t: m7 x, y I& C5 F
- var
7 W- |5 u/ n @ - deviceEnumerator: IMMDeviceEnumerator;% t0 {. C7 K# P" V
- defaultDevice: IMMDevice;
# T& q7 M0 B% ^6 y - begin: s3 [6 B3 \% P* |' G
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);2 S( `2 |7 t D2 U. B
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);9 a J+ J: a: W5 ~% Q0 m
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
( P! t0 c8 t/ S* B9 M) E7 v - end;
( z, O& R( I, O2 ~" f! C; [& F7 Q - % [3 e5 W+ H* e! r
- procedure TForm1.Button1Click(Sender: TObject);0 {1 K" D# T' y# \
- var" [1 ?. K, x; Y
- VolumeLevel: Single;& Z3 g4 j: z7 q# S6 L
- begin p v0 M- m! C2 u9 S% {) q3 V8 r* N- K
- if endpointVolume = nil then Exit;
/ H3 F9 A4 r0 Y1 [0 O5 r - VolumeLevel := 0.50;/ n2 j+ r! g; G' B; w" _
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
* @& o% ~ }8 p! S: ` - Caption := Format('%1.8f', [VolumeLevel])1 P$ f# ^! s. T: @
- end;
6 k. X0 @8 F+ U. o* ]
3 b4 a2 D2 _2 n" I. j% p' M- ///////////////////////////////////// j4 d% t/ y: }5 y7 F/ i( w T
$ C6 M1 m+ Y0 B+ _# a8 }9 i8 o- // with best regards ToxicDream
* X# e. m: U( C' N9 P; y$ Z S
复制代码 |
|