|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0583 b! C2 Y' i6 P/ k0 v
By Mukta & ToxicDream- ' T" n# K/ t* q4 [: g$ Q
- //for delphi 5
' _1 u& B1 |8 |6 ^* N - unit MMDevApi_tlb;, j* ~+ r+ i2 n# `5 Z
. w3 J4 {; [ f4 k+ E1 y- interface
: `- Q7 i' q' d$ A - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
1 A2 \) W( }2 p% b - const
( t' Z* a/ M# a - // TypeLibrary Major and minor versions0 P5 W+ ?0 F! t& K' H! a
- u0 _! ~$ ^0 n6 ~( f( O- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';. D5 T1 K! t9 M
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
! ]# g8 L3 }7 J3 J; X3 R- \ - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
" C5 l1 ?& n( X4 A# P - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
1 U/ P% d8 t! w& f) P2 d+ r& w - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
4 @8 B: r& _0 w5 Q - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';5 }2 U4 j% Z ]) q Q* @
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
5 X" b S& n& f
$ D6 C* g9 Q7 h5 m( A. D4 q" g5 I- DEVICE_STATE_ACTIVE = $00000001;0 k; [+ A# H1 V1 B7 u" S) S
- DEVICE_STATE_UNPLUGGED = $00000002;; a( S5 ]) C. w; ^$ f
- DEVICE_STATE_NOTPRESENT = $00000004;
/ Y$ g# V: P% Q" N7 c - DEVICE_STATEMASK_ALL = $00000007;7 w; k$ H, @/ g! |' G% L" f
( Z: `. M W6 P! r' E& ~. J- type
" L+ Q1 F: Z- f! {1 ]; o - EDataFlow = TOleEnum;
$ R* b( Q f- |& K - const
1 h5 D+ w% D# E+ |* s+ e6 V/ f - eRender = $00000000;4 g& f# `4 R% F& |' c
- eCapture = $00000001;3 u& D( m: c1 I+ `
- eAll = $00000002;
9 p5 _7 ]- n, {' q! ~0 c" _9 p - EDataFlow_enum_count = $00000003;
1 C: n' b5 {( g* A! z& W, U1 M - @! `. r2 b2 J" J# V
- type, h1 i) h2 n% m0 ?: |
- ERole = TOleEnum;3 ~; t' ?1 X: F" E0 ]- }
- const& d. P3 W7 N' V: I1 c& k* s7 u
- eConsole = $00000000;
{; ~% E. ]& Y, s( \ - eMultimedia = $00000001;
8 }' @+ U4 h" p+ V3 L* g6 U1 t7 H - eCommunications = $00000002;7 Q6 I- i% x9 W
- ERole_enum_count = $00000003;
9 F9 G8 R7 {! w; f - 8 b, I/ Z9 S5 N2 u0 I$ _
- type
% H3 d% Z; p+ d# g7 ] - IAudioEndpointVolumeCallback = interface(IUnknown)) b7 H2 S, `7 K" R& t4 t1 Y
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']' O, e% a' E9 B
- end;# b0 `! ?& l8 f% _0 \1 E
- 1 L' q9 c8 I3 k0 H7 V: r) f
- IMMAudioEndpointVolume = interface(IUnknown)
6 K( J5 {. F4 d$ u; K* M" i, [" W - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
6 ~: v3 {( N, P0 {$ Z - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
3 x$ ~7 J) W# e8 a - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;5 G& \; R9 y) f
- Function GetChannelCount(out PInteger): Integer; stdcall;! s5 n3 _' R% C9 Z/ I. P5 H
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;$ N* g/ T( Z5 D# p9 j/ B& B# O
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;& s/ u8 y \+ Q9 p" {
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;' w% b9 z3 W& }) x
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;) E- l7 _" |, H- P% ^
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
d1 w$ g9 W9 y2 T3 } - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
* |3 Q6 Q `" @, f, A3 u0 H - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
! O, G1 x" n) @% b: Y - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;/ m1 x q3 j! D ^
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;
, J& W( g9 S; V$ F6 k9 R - Function GetMute(out bMute: Boolean ) :Integer; stdcall;
2 A- V: [) V( u - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;4 ]- h# {# `; r9 E, g% s1 k
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
9 s9 Y+ d( ]0 I" h2 I$ { - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;6 q2 Q- M! j5 R- y
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
& W- ?3 S) B1 ]$ F B/ c, V" \ - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
6 `( v3 L9 N: M' t \% A6 w - end;
8 P( i% V" J7 b. g. J$ e6 O( q7 { - " e8 \2 z" `' M9 L0 }; b* o2 c
- { IAudioMeterInformation = interface(IUnknown)' ?& }3 o `2 h. C" L! S
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']7 z5 r0 R7 `- t- d: Q$ {
- end;}
; l1 y4 ? O# y& U" I - , P1 F3 a+ c6 b2 b! o3 b4 v
- IPropertyStore = interface(IUnknown): @4 `$ Q# v3 J! }# A& `
- end;
9 q' b2 `% s. F% ?: y6 T$ w! }: | - 2 G; v& v- P1 S
- type
) t2 }, p O" r2 f9 E - IMMDevice = interface(IUnknown) t2 b+ u& u7 T! Z7 L. \9 a
- ['{D666063F-1587-4E43-81F1-B948E807363F}'] G3 }# V& E" d% h; G
- Function Activate( refId :TGUID;9 \9 Q- B2 U# f5 \9 B
- dwClsCtx: DWORD;
& B. _1 [5 s$ C. C; N% s. s. D! D - pActivationParams: PInteger ;
$ b+ p3 M, ?. _1 ~% `0 Y' H. D - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;% f0 ?, j5 t$ m+ i
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;5 n- z6 w& s- E: e0 a
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
# |! j5 ^: J' p3 F$ c - Function GetState(out State :Integer): Hresult; stdcall;
; H* K, N4 w. z. t+ M - - Y8 h% E# ]3 Z1 d& i3 M1 A$ n
- end;
1 E" G4 Z# J3 b+ z8 j& S4 v
8 |' [* Z" o/ x3 Z- x, v, M& P' b- 4 n5 V2 ~# \& q/ n( i3 T2 Y
- IMMDeviceCollection = interface(IUnknown)5 G$ l/ v, y& K% x% y/ s g- c
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
* L0 R5 { {" Y; ?: R2 r, o" s - end;% R$ w1 \% Q. a' {9 F! O
4 F P6 G2 O' q& p. ]% `0 t- IMMNotificationClient = interface (IUnknown)
7 N7 v% B% @; K9 l: \5 _ - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']6 d8 Z) c6 _" T# c. R$ ^: a- Q
- end;' i# P/ O/ q j- h; S0 F5 v$ C
- 5 _0 |9 F) @ }! F* ` V
- IMMDeviceEnumerator = interface(IUnknown)& ~# c5 J o# [* Z# U
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']& d, d; k: t* O/ c0 `
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;1 f# z& i K# c; _6 @9 n6 u E6 F0 R) |
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;; o$ D+ N( X' `7 w; Q1 R
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;# c1 l. F% i" C4 ]" s- z
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
9 x4 G K+ s6 g* s - end;
$ ~( M+ x4 K/ o. k" g g+ { - ( u* S5 O- N6 w
- implementation% m% V3 T6 A6 q4 R; Q9 K! R& i
- end.
; Y3 R) y8 F5 e! D. N
, L) V, Q/ _0 M$ T& d- w- Thanks & Reagrds,/ z- ~( T+ u$ O% J4 ]
- Mukta .... X1 h" f; Z* z# K; J/ T1 M5 G
复制代码- ; B# `" [, i) ^- X# a0 \4 c
- it's work in Delphi 7' n1 X" j' y, F. }. P3 p% g
- //////////////////////////
4 P8 d7 J o. t/ k% @% k
9 e7 f, B! }* w3 K# Y0 ~- unit MMDevApi;
O' ~- j& u; U0 a8 r+ `
1 ^) ^" O8 V7 B$ X: p- k$ u% j& K- interface! n/ g* @' e: n' e) f) a
- + v6 |9 J0 e3 k( P
- uses
% H0 T+ C& ?/ t- R$ W, M - Windows, ActiveX, ComObj;( Y3 {' t$ x1 L) n/ c9 ~1 ^
8 F0 q: }0 E, A- const
. B( @; j: T! e9 g" x - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';1 o) R& O7 p8 X+ H$ B
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';# X$ t" B" a" G6 e5 g+ P6 Q
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';% H3 d$ P4 G$ l6 [$ v4 v. O
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';( i# W' T# R) F9 X5 a% U
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';' S M7 B& I$ s* f1 t
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
9 [- k. e4 ^. Z, P+ y - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
j+ Y0 l6 p- R( E2 h$ a - 1 k, n9 Y2 k/ M2 [" p$ W4 y
- DEVICE_STATE_ACTIVE = $00000001;9 N o/ }6 M2 V3 j, Y1 W- n
- DEVICE_STATE_UNPLUGGED = $00000002;
4 V$ P; ?4 P( I9 b8 {4 P+ u& j - DEVICE_STATE_NOTPRESENT = $00000004;9 M6 i/ ^, N7 G1 y& Y7 d
- DEVICE_STATEMASK_ALL = $00000007;5 |$ Y1 ~- b- O5 P" V- j) u
+ j) Z. E9 g) [5 d, O- type
6 z( A; ~( N% t' S- W+ j7 z - EDataFlow = TOleEnum;: d4 | X, y8 R$ F# b
* b; ^7 o2 v* m0 ~- const" e. L( D, E4 D# {; Q; ^
- eRender = $00000000;
2 `. u# v4 b. O: T3 H- \ - eCapture = $00000001;2 V5 {/ v# J& R* u7 O0 J
- eAll = $00000002;0 P5 `* k# N8 D" }
- EDataFlow_enum_count = $00000003;
0 R+ I1 p) k2 a0 V2 p* }, T
, r* w2 S* x2 t! f- type
0 N8 d+ E% z' d7 I' l" c - ERole = TOleEnum;+ _( m7 k2 o3 W6 t* a2 r
" }% u' b# e. {$ v3 Q! F C- const
7 F9 G& K0 C0 Y, l8 q+ ~ - eConsole = $00000000;. @8 n- D1 u+ b$ m4 I3 @
- eMultimedia = $00000001;7 f7 x. E0 A) b8 S) s# ]4 S) V
- eCommunications = $00000002;
! n; Y3 K3 F$ c1 o; a T& R, {3 D - ERole_enum_count = $00000003;
6 E5 E5 z/ h$ z+ I
& Y3 n% F4 Y) {$ T7 Z8 J9 v) @- type
; ~6 {( `2 m, f2 } - IAudioEndpointVolumeCallback = interface(IUnknown)6 D( v2 q5 s Q/ E8 g9 Y
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']2 Q1 F+ p( B* P
- end;3 H/ v$ Q8 N! I) H5 Z- b
% |- v5 p$ f% C0 }8 c+ p, h- IAudioEndpointVolume = interface(IUnknown)
% x5 P. S3 e" u3 O: | - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']8 ^2 o: i. B% Q" v& m
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
+ }" I+ p( {, m2 X# m% G0 {- N6 j3 |' h* ~ - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
A! `- z0 k2 j3 B - function GetChannelCount(out PInteger): Integer; stdcall;4 `% z" M% |( a( |
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;% T* u9 C# s9 N! Z" Y, V- h
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
, v* | l" ?) z# h - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;, `/ ]# W8 n: O) f2 }& O3 T* t
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;$ B3 y& N/ u3 t0 V; s5 }' E8 s
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
4 u! l! X. ]$ q7 C s! }: O - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;: S% t# w8 ?( `
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;3 D: v B! ^; z* e c. N* H
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;9 V& B7 b" {2 k+ L
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
9 r5 L! t B# B, U2 M" ] - function GetMute(out bMute: Boolean): Integer; stdcall;
, s& p0 B" I6 ~- L" O* z - function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
1 }! v7 @* |/ e S4 o K6 o+ g - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;( G; p l9 t7 A% g, [4 N
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;, A; L6 j; p9 Q3 i
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
; M& r% S7 f. a& h - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
H, w4 e2 C' \& w- F5 E - end;
* K6 x* Q- v; V& o8 L5 ~ - % D T! U' _% E, d0 u
- IAudioMeterInformation = interface(IUnknown)6 j5 H& ^8 b K4 Q
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']2 }! B' T7 X* p6 X
- end;
% G* c4 K: d3 Y3 X, w0 v4 [" [ - ; c2 {8 f. [) K3 C6 g1 S2 g0 u) f
- IPropertyStore = interface(IUnknown)
# X4 {5 [9 K; w3 u - end;
8 Y5 C: ]% J; G- ~ - ; x. T. }; t. e x
- IMMDevice = interface(IUnknown)
5 H9 Y" Q& n7 u% t - ['{D666063F-1587-4E43-81F1-B948E807363F}']
- K9 C# Q8 ?, x. V- o! b, M5 s: g. j - function Activate(const refId: TGUID;
6 H* |4 L V6 Q* ?% q - dwClsCtx: DWORD;, t ^9 l m4 r
- pActivationParams: PInteger;
. n: @" O" q; z& `4 o - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;7 n j, r0 L$ v
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
1 p( [7 b# q/ P$ m - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
% }3 ]: d' A$ V) R3 k0 _) l2 T - function GetState(out State: Integer): Hresult; stdcall;
8 N) r% X1 }9 y0 z/ O8 _7 v, q$ q( | - end;* K( }+ u+ }& V3 |+ h# M. t
- f( B$ k7 @: A, F5 U3 S% y$ H' s- ; O2 k/ z6 Y# {# ^
- IMMDeviceCollection = interface(IUnknown)5 D; k* D n- s% P' ?0 ]
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
6 X/ p6 `# V9 ]# V. M' H; J9 i - end;6 J. }0 X9 C& P
: q# _% e1 R! D: i% ?8 Q2 a- IMMNotificationClient = interface(IUnknown)
: V0 q+ l$ _' W; U& t, | - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
3 @% z' b/ B6 l - end;
# K7 t( @3 D" ?- N$ C$ }- x - 3 F0 s! ~/ [: z# I
- IMMDeviceEnumerator = interface(IUnknown): s2 J& f6 d/ v* w& e
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
/ A7 h, h" ?; j8 w3 A4 o) W% Z% L - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
% e" [; O3 Q% M& L% y - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
3 h, _% A: P" v$ {. _% o - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;7 B { k, R( V3 c4 E
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
* O6 m2 {0 V; ^ - end;/ M, Z' q; r. o# `# W5 E3 v: \
" V4 X6 b- O0 ]8 Q% A9 F. p- implementation
) n w' L- J& \8 ] ^* ` - 1 ^9 [* ]# X! E
- end.# }( t- h& s, ]. w: N+ p
: \' e6 S2 D4 N- ///////////////////////# B: Z2 b: {7 |% `# B+ Q
- simple sample :)
# h/ z3 ^# _) B$ ^9 b - ///////////////////////
4 B& c1 p( L, q& D
, f! o5 S4 |/ B- //...... other code
: w# }% p2 o O% A
) `6 j4 A& e( g. b4 W* j- uses ... ActiveX, MMDevApi, ...;7 ~) n" j: I4 ^4 o$ J7 _
) L+ R9 ~. p$ z$ i9 b6 Y- //...... other code
K2 k% k, G* a" Z0 u - 8 y5 b. k, O6 S- @( J* S
- var
Q+ R* s) m9 g* m# d2 n - endpointVolume: IAudioEndpointVolume = nil;: L) B5 I! t' [/ a( _) C5 E
, s) A1 |6 k- _+ R& o- procedure TForm1.FormCreate(Sender: TObject);
% X3 V7 j1 Z+ A/ m; @5 g - var
# M& N% S. l: L3 e K - deviceEnumerator: IMMDeviceEnumerator;. w+ R: P/ a' y ?
- defaultDevice: IMMDevice;
. e: `+ p5 v. _2 | - begin
' @3 N0 q' ~8 e W- F% u - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);7 L$ C7 e+ J9 ]' T5 C3 t4 M& b
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
5 e$ F3 x, j. I5 v R - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
; _$ v0 _# g7 |$ S, ^0 { - end;- N2 Q3 a/ L3 k9 D; G7 s; b' I
( Y& X6 e p+ a( c- procedure TForm1.Button1Click(Sender: TObject);
3 m% I9 j4 n, v; k" T+ ? - var) e9 E' P5 @; D- c
- VolumeLevel: Single;
, n; [7 ]- P% X - begin0 L9 ]1 ~1 C- x, l+ h, {9 ^
- if endpointVolume = nil then Exit;8 b3 ^, j q7 q0 w
- VolumeLevel := 0.50;+ f/ G" ]5 |9 K9 L4 @0 H
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);; |/ j E: K9 w9 H) U- u* M
- Caption := Format('%1.8f', [VolumeLevel])* ^* t$ F1 z- A G# C
- end;8 v, K# _) ?- [$ N
+ I- K R1 e V: H' v8 u- /////////////////////////////////////
; n3 M) k$ H+ Y. t9 [
$ `2 q/ t2 q9 O9 @* k" Y& F- // with best regards ToxicDream
9 Q% U2 z9 _7 V( n8 I. g
复制代码 |
|