|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0582 u% t, ]% F/ T. A7 {8 b; E
By Mukta & ToxicDream
/ T( n* _/ R! v- _) P4 p- //for delphi 5
2 U. R, x; g y7 S7 n% j9 w8 _$ G. ^ - unit MMDevApi_tlb;
" c w& H3 o5 R4 b* @ K: H+ j- l
- r8 u- Q6 Z- k! T- interface
) Z3 i2 e* }6 ?$ x4 P8 `( ~ - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;( ^5 _* h* ~8 E9 `% H
- const% ~6 z$ D1 Z0 h Y; Y
- // TypeLibrary Major and minor versions
; E( N8 e* {) K7 w- w- C8 ]
, D1 ]0 a- I W1 O% a0 @, r4 a- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
6 K* Y6 O0 q6 K - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';' P* ?+ X7 ?/ u. K3 q0 h" w3 Z
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';) w, K2 Q' n* O; Z, m) K
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';5 \0 h0 n3 W+ I/ |9 ^; i" |
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';1 \) r# H: q" P
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';& J$ q8 C7 t* Z2 Q7 b
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}'; t s" I8 `& _. T
+ b) Z, ?6 _: E+ }5 D& q- DEVICE_STATE_ACTIVE = $00000001;
, M/ M5 E$ H, [( X - DEVICE_STATE_UNPLUGGED = $00000002;5 B6 U- N, c$ N, n% w& k
- DEVICE_STATE_NOTPRESENT = $00000004;$ {$ A! ~1 N6 c5 ^. J: E
- DEVICE_STATEMASK_ALL = $00000007;
: a; n3 O4 O8 M9 _4 V0 ^" C
' J7 y0 c: ~% D1 m' w- type
- m% J5 \2 u. r. K8 J4 v - EDataFlow = TOleEnum;
. V: R, U) g& _& b2 X5 Q' F - const; j( p, p% M3 i0 X
- eRender = $00000000;2 G. o9 O) Y- f8 q4 _% T
- eCapture = $00000001;% e7 r, ]& x) q: }. N+ C) |: b1 G* i
- eAll = $00000002;4 w" ^& N- K) ?6 E: I/ M5 ? n4 y! K
- EDataFlow_enum_count = $00000003;$ c( S4 h% P- \/ g' o" B
% j0 Z+ F: q& I/ J* V+ W- type
0 c9 @ i7 K" W- B; X - ERole = TOleEnum;
8 p% g5 e' F( U$ r9 a% u6 a2 \* W6 q - const
4 u, R: }; |9 M0 G& ] - eConsole = $00000000;
! [/ G- ]3 v/ x' h2 t4 d M% y - eMultimedia = $00000001;+ D7 h7 m4 _0 u- ?( T& J7 H
- eCommunications = $00000002;
8 m" d3 m: n& @3 w6 [2 @5 F* d - ERole_enum_count = $00000003;5 {+ ?& W% |) |: o. x
- 2 k i& m- I% V! _
- type2 M: q7 y8 q) W: E* A* @ g
- IAudioEndpointVolumeCallback = interface(IUnknown)# V. A( y7 X' z) S! B/ L7 u; J
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
2 a4 Z9 {" @. @% ?# f+ z - end;
9 j( V3 d5 f' @! c+ \4 e" v0 Y - 6 y2 V5 D: ^8 F9 K$ e- K
- IMMAudioEndpointVolume = interface(IUnknown)' }# h1 M5 H; r, ]/ o! P0 o
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
6 X; W$ Q6 x) d2 s6 _4 p. P - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;0 B& H- q! b& |7 J; j, z
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
7 ] z! N9 _2 x3 p# X; P - Function GetChannelCount(out PInteger): Integer; stdcall;
) R0 f. K h( @ - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
9 y9 T, @# z, H3 {9 @. C - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
! a: N9 W. s) F* h) m Z" w1 w - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;- O+ v! ^7 P& L' k) S" g
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
& H5 j$ b# g0 y1 k& P1 p - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
. O9 V% L" b4 \' U: S' a( K - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
6 C9 p; f9 m" C9 m - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;2 _8 E% p# s, H e4 } `5 M
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;* v% G& f2 z3 \6 J- y' J' @6 I
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
# I8 n1 | }: W# i - Function GetMute(out bMute: Boolean ) :Integer; stdcall;
5 c: ~7 T- C$ j/ F* O: A9 |, ^1 H - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
* m7 ]1 u( u2 k7 v - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;9 [ W- n, ^& c- ^8 G- Z
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
8 J8 Q( S: }4 A2 I - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;" U' O% G& u" h$ z1 R- _
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
- v8 X! t' ]( c4 n$ @- {- H - end;& o) S$ h$ x: l( f, f2 d# I8 K
- 4 [# q- d: r, o) r+ ?) r
- { IAudioMeterInformation = interface(IUnknown)
$ A- Z% f! m/ D6 R9 ^ - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']! k( |7 Z8 L+ H' h
- end;}
0 v6 y' b& B2 y& P$ e! d$ |
7 H. [ O& d9 q- IPropertyStore = interface(IUnknown)
- x7 W6 F2 X! _. H- h7 j - end;! Z! b, H, j9 ^5 {1 s* ?) T7 Y
* k% }3 d2 R0 A4 x' c$ @- type9 V" k3 G s# P( h) f9 K5 U) Y- A
- IMMDevice = interface(IUnknown)) O! y2 P1 M; t+ {+ ?* Z
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
0 W0 a; m3 J3 R - Function Activate( refId :TGUID;
: T9 r! G5 ]7 H8 J - dwClsCtx: DWORD;6 L1 m1 f2 ]- D. v9 F
- pActivationParams: PInteger ;$ q/ H1 l2 i2 `1 U
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
$ `; w1 T) [: q5 g - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
9 c9 Y+ w3 ]- B4 L3 s& k* q* W+ k( F - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
0 n/ m9 F. e6 @% j - Function GetState(out State :Integer): Hresult; stdcall;' T! a- x+ x0 U& F
1 Q- g: d" |1 r5 e' G' i- end;8 O0 X5 V$ F; A) {
- & R) B% x: @& ~8 z
- 8 S' G+ o; V2 S) L* o
- IMMDeviceCollection = interface(IUnknown)5 }" W$ @4 _2 C2 P. M
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']8 U! E' W0 Q; i' J, @
- end;2 E- W1 {( g2 X/ |' Z
- / u9 R$ A; i' K- O4 L: k, D9 H0 ]+ b0 G
- IMMNotificationClient = interface (IUnknown)
6 q, o% K, W/ Y/ J# G - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']3 e+ f; j% c5 b7 z/ s, n
- end;
4 F/ i0 R1 B9 m8 H - 6 t: d" t) F8 O# d" @& B
- IMMDeviceEnumerator = interface(IUnknown) S0 z# U7 D: @3 C3 c6 _
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
' g$ k8 i% z& O - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;" H# S; F5 i) V6 Y C& A
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;+ E% B' b7 M3 ], ]
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
* j2 i: ?1 R/ k3 k, X7 K# D& F4 d - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;+ y7 o9 u: T" E( U9 j. ^
- end;4 {; R+ ?+ O# z! _4 o$ J; U
7 H$ n+ ^0 R) X1 N7 C( c- implementation
) B6 P' v7 L0 ? - end.) ^/ i1 A [( w
- ; F V" S# K: [3 u3 J
- Thanks & Reagrds,
/ ?2 X/ A6 R5 |* k: y - Mukta ...
2 M$ V$ V x0 f4 u2 ?5 {7 B @
复制代码
0 V, y @0 l: J- \- it's work in Delphi 7- j' E9 o# m) D/ B) h
- //////////////////////////
2 a2 a- S/ y. H4 S" j
1 |" D9 `: ?4 }; x+ P: K# O- unit MMDevApi;
2 e. F7 v8 N4 u
7 N0 ?; u% p' _: z- interface& q4 j1 C* m w. [
- , U2 e" g" F) ?8 p& d; a' m3 o) V
- uses
) U" d# ]" n9 D* r) f - Windows, ActiveX, ComObj;
( d) }5 N* s& F$ n0 G( f! m6 D - + @; n9 ~ t* Q3 i
- const* n5 f% ^1 w4 a7 V- l0 X
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}'; i; b$ a9 V& X5 D, D/ w7 y+ Q4 w
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';6 h5 e ~/ m- w' l
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';0 {' Y* I% p9 `5 u5 M
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';( A1 j& [$ P! U4 A, o
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';0 M2 Q" z3 D6 i& o1 }8 f
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
- \# Z9 @4 o1 V7 z0 c - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
: \7 e# V2 M) s' R - & b/ H9 W z" P/ t8 M/ i* g0 [
- DEVICE_STATE_ACTIVE = $00000001;
$ e/ p- t/ Y: S8 T- o3 U4 a - DEVICE_STATE_UNPLUGGED = $00000002;
2 N- [4 T+ h1 p0 c: v - DEVICE_STATE_NOTPRESENT = $00000004; L" ]5 V' N, N9 q/ n
- DEVICE_STATEMASK_ALL = $00000007;
+ ^( \) T6 j9 L- R& I
9 W& V4 r! |1 c8 @+ s* v, T; C* o- type" I+ R* p3 R9 R. k
- EDataFlow = TOleEnum;- H; x6 O; L! ~6 R
" X. y3 m- B& ^' C8 O* C, S- const
# U8 c) { G# ^4 x6 N; P - eRender = $00000000;$ o" A S: x5 w; n4 ?
- eCapture = $00000001;, |: `# s5 O9 w+ S8 l- H
- eAll = $00000002;, d* s# w5 A8 X% h/ T% X. u+ {2 {
- EDataFlow_enum_count = $00000003;
- q1 ~: G; I& Y3 J9 x4 o - 6 S; v; F f$ k( o" e
- type
7 X0 ^* [# C: L$ R) h - ERole = TOleEnum;
1 Y% f: @0 ~4 x& s# J
& o; Z* z. v+ z c- c- const
9 [4 b1 h/ X1 f8 z3 F - eConsole = $00000000;
2 z4 |: H5 l# M) }. ]( D' u8 v' z) e - eMultimedia = $00000001;
0 v- L, V% m: s4 S Z9 @ - eCommunications = $00000002;
/ @1 P9 K8 ], g r: ?6 \ - ERole_enum_count = $00000003;
& ?" J6 j; F8 r' g: T( f H. [ - ! w2 O. Y9 Y0 w) v& t' D
- type" u8 V. x# G2 N3 I2 o
- IAudioEndpointVolumeCallback = interface(IUnknown)) W% M9 c. n/ ]# F5 l2 s- B. c( e
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
$ R/ F8 D5 G- ? - end;4 W6 x; f4 l7 I' m1 ]3 x" D( ]3 l
- & n" K0 L6 m* \! D* z1 U
- IAudioEndpointVolume = interface(IUnknown)
" D8 z" O- O$ a - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']2 i( e( l/ F# r% G1 c
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;& y6 N$ g% c& X3 d8 X$ C
- function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
/ E, G8 N" d9 O& c: {, u - function GetChannelCount(out PInteger): Integer; stdcall;
( H t% q% W( c - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
4 ?8 S" J' `% C1 T; ^$ [ - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;* q. J2 U" I1 ^$ X; x0 Q" c
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;; P6 L& A4 x8 {8 A/ ^
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;7 `0 }' L0 Y% Z/ M3 W! a2 D7 V& }
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
1 F/ {6 A/ a G - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;. z1 b0 i# O/ @9 Z! @
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
7 z ^' c& r/ i [ - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
" z; ^; |/ ?7 ]# C9 |2 z& g' O6 A/ T2 _ - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;/ g: @- ~# M6 T" y1 h( M- |
- function GetMute(out bMute: Boolean): Integer; stdcall;, _5 o. r. v2 @8 d" r
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;% b7 Y0 u, Q2 ~6 n# w" g8 H
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
/ r0 x# ` M# R7 \ - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
" \, [* I. w+ I7 Q3 O - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;& } D" E4 h- ]4 W" @9 v# U8 u
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
9 @2 w8 K& U- M! h$ F$ X6 C - end;
5 X1 h+ A5 q" m4 t' q! L5 P/ w2 | - ( E4 k% O0 I) x7 }$ H
- IAudioMeterInformation = interface(IUnknown), X8 s7 K' x3 I- T! c' `
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']/ w5 D/ v' P1 \
- end;
/ R) N* d& P7 J1 X1 x6 I - 8 w2 Q* ]9 e! U% B% l
- IPropertyStore = interface(IUnknown)6 {' X( s6 A; u# Q$ X& X+ [
- end;
w; @/ D5 g; L& Z: d - 4 p2 ~1 B/ E& R. F) p- n/ A
- IMMDevice = interface(IUnknown)3 X7 e2 Z1 H0 F$ {7 W
- ['{D666063F-1587-4E43-81F1-B948E807363F}']( w" M p1 s% l' r0 Q1 ~
- function Activate(const refId: TGUID;
0 b* T8 f, z+ o+ V& ?" p+ @ - dwClsCtx: DWORD;% Y( _# j R; l* N/ Y, B
- pActivationParams: PInteger;
( [! K s. D5 W, Q8 v7 O - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;4 c2 }4 q" j2 r6 Y- m
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;+ L8 V0 I/ F+ i+ I. e1 k9 A( l f- j
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;* D6 u# q, A; t. ]! s
- function GetState(out State: Integer): Hresult; stdcall;& k( [/ B8 ?* ^6 @7 U4 ?3 P. e; A
- end;0 Q' _& F( i/ n9 v. J" `5 _
- : E' d; C. e0 E: v/ p3 O8 V
- 1 l1 V/ o- h4 f E3 E$ _+ ^
- IMMDeviceCollection = interface(IUnknown)0 ^- h- k5 A" B2 X X: v
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']/ Q/ Z) u, K4 ?5 B4 x6 _
- end;. b) [7 W W8 ]& g% p
- $ `! h2 u7 P& C+ G
- IMMNotificationClient = interface(IUnknown)
6 K; R* ~5 J6 y. y' n; n - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']7 |! T1 r! e' l4 P
- end;
. n. u. f5 f- Z
" L, m k# Y+ X" j- IMMDeviceEnumerator = interface(IUnknown)0 _; a9 @9 X. J- ]; z/ j8 Z: k
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']. _, j$ m& @# V8 p: O
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
1 \ y9 Q2 p0 t; W - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;/ q9 @; l$ A/ o+ |0 n P
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
* Z# V+ m+ |( t' U% o/ i" v* ` - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;3 f! G2 e6 ]; p/ O' X x: l
- end;3 l4 ]! Q' k: X+ |$ E& m
: ~: O9 d3 M- p* }- implementation
3 G1 a! }9 o- l7 w% i7 g: `% d - A) }0 S) K1 L5 v9 s h, {
- end.# v: S: J1 P* z! o9 E' k
- 7 N. o+ y' ?* I3 s, Y( [" o/ @
- ///////////////////////
( i0 ], ^0 g! [7 c s P- b) | - simple sample :)
2 F* A! H/ o" X - ///////////////////////5 @5 S; l+ _) Q$ V
. X6 N% C( ^3 h- //...... other code& ~7 o ?9 N0 g) c; v) g
- L0 c+ y$ X; Q6 x. \+ N2 P- uses ... ActiveX, MMDevApi, ...;
r# ^, @ ]; }0 l% f7 e - t2 T, q% S3 L }+ S
- //...... other code2 N: |) t5 [% N
' p4 @; a6 ~! i1 I! E% |+ {- var
/ p$ H; C8 c6 s, b" z' n - endpointVolume: IAudioEndpointVolume = nil;. V9 V# {! r. I) |, F* }
- + |" w: |2 W8 N% [0 Q- j6 f5 W
- procedure TForm1.FormCreate(Sender: TObject);
O/ D1 J& F. [$ A% e$ t - var
1 Y) a+ d! U: E# {+ H - deviceEnumerator: IMMDeviceEnumerator;0 I' H& q% g: V. }* ]
- defaultDevice: IMMDevice;: v- f5 i! [) V/ V
- begin/ d' ~8 s0 C3 D
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
3 {( D- `3 _$ n- l1 Q - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);( A7 s" o# E3 }& N2 b) d0 D; f6 q9 ~
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);* B) h; F! x! a& Q# G% g
- end;
0 I0 C$ o E* {) R4 l9 e
% `2 K7 e6 X( H3 f, t! @2 d- procedure TForm1.Button1Click(Sender: TObject);& _4 n) O7 q4 s6 q
- var& V) l1 g% M7 D% h
- VolumeLevel: Single;
, q9 u1 {/ O! I' {0 a - begin
' q1 k6 H! N0 c( }1 } - if endpointVolume = nil then Exit;3 L& ^ n( B s- g+ {. y
- VolumeLevel := 0.50;
# ` s* v X, K3 j - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
! p3 ~& [ J$ I - Caption := Format('%1.8f', [VolumeLevel])* h; c$ G/ q5 g. o9 x
- end;
' v" S+ a8 z3 y, T+ I) Y; I - $ ]$ g- m% Q: ^- U
- /////////////////////////////////////8 l3 D6 o' D4 x( p
: L4 W" X4 p. Q# b% n. D" n+ ` _- // with best regards ToxicDream
( o- g: A& w# p# ?2 d1 J
复制代码 |
|