|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
: b) @1 V* |( O" ` u% WBy Mukta & ToxicDream- 1 _/ i- A B# g( _5 \
- //for delphi 5" S* {5 V# x, w( e. r$ j; b; R7 [
- unit MMDevApi_tlb; D: Q3 @9 J8 }. A- N; n
) t# D1 x5 T2 L# l; ]- interface
q: n+ K: ]) o; _7 Z9 A4 } - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
0 P/ ~! e9 \1 g( ]% c - const
# {! L7 U7 x0 H4 i - // TypeLibrary Major and minor versions- G* F7 F# T- g& L6 m' [& U
- 3 v/ \1 v6 x; s( T! k6 G9 \
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';6 @, n0 C& R+ K3 x
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';% O& |$ @ q1 y
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';5 x- _7 ]; f y7 }. L) Y/ l. Y
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
4 c% p7 M) K* b8 k- M/ b: u1 q - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
5 k: f7 j% S7 [ - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';* i5 }+ k0 |4 w0 x' I, H/ w/ U
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';7 Z6 U) a# _& d( c, D. Y( B
6 T/ A s( {% r- DEVICE_STATE_ACTIVE = $00000001;
& p5 f7 k$ @( g: E- x1 j: L - DEVICE_STATE_UNPLUGGED = $00000002;
4 ~. Q% F& D5 ]6 ~ - DEVICE_STATE_NOTPRESENT = $00000004;
, Q# c# u- [2 s, b' u4 d- r - DEVICE_STATEMASK_ALL = $00000007;
) A& D- I7 L. W x" U. _2 y! g2 L# d
8 x- Z! _2 U( l: o& a+ T1 |$ k- type' c# K% g) `: V" s9 j
- EDataFlow = TOleEnum;
9 ^0 V* l) Y( I - const
6 m, V' Q9 N! [# O! [! r - eRender = $00000000;
5 a$ @( A0 B* |( r3 a - eCapture = $00000001;, J H5 C7 p" G: y. ^
- eAll = $00000002;8 T, p6 x5 g6 r- E0 D4 m9 H& F
- EDataFlow_enum_count = $00000003;
. ~( k! ~2 o: ~, `6 {# S4 _ - * U- o9 U' b; c& [
- type
4 h3 ]" L2 @+ |0 \ - ERole = TOleEnum;
, l" y0 I8 F5 {& z - const
% Q2 ]$ [4 ]4 ` - eConsole = $00000000;
0 c6 ~$ G/ i# E( I1 ]9 y- } - eMultimedia = $00000001;
3 S; _3 c+ ~% T E% E - eCommunications = $00000002;/ m% q9 N G5 R/ T8 n8 E; J {
- ERole_enum_count = $00000003;' P) }1 b* I( k( Z
- 8 `' ^! M* T9 Y6 b: Q
- type
9 j7 ?) d+ c! K1 V* Y: A+ D - IAudioEndpointVolumeCallback = interface(IUnknown)0 S' w5 v) q3 Q7 z7 N }
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']( o) S- n! Q. z) b$ H
- end;
" n n6 ?: n" ^) S- ~ - - D4 A# h5 R" \1 r; ?* M
- IMMAudioEndpointVolume = interface(IUnknown)
+ x/ R# o1 l q I0 E, F - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
k4 i6 W% _# I1 [ - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;0 P/ H8 i5 ]5 r! @5 d$ |
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;# h5 h l, |2 U
- Function GetChannelCount(out PInteger): Integer; stdcall;
$ S7 O' X& E. T5 U6 X - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;3 | V/ M! g# Z
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall; p/ H7 v1 C5 v: Y- A/ y+ f b
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;" m/ u9 s+ x5 A$ t$ p. q: P
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;' z, i- j: Q3 [
- Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
/ x2 t; g( Y( Z. m# \; F) W - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;5 p' U; S. X$ U% S* e8 `6 g7 z
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
! J( I! |. r' \2 a4 e* H - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
8 i$ ^. @3 X7 ~" r9 D - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;. w( c: k7 D6 F
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;: w) x: y0 \7 V' G
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
1 |) z( u$ X2 h( t - Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
$ I' z1 u. ~% v" v% w - Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;9 ^! H4 K+ g8 P: d8 g
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall; z" G4 W% a- \3 B) O N4 O
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;- h/ K" }+ Q& A0 c* k' l! C( C
- end;
" R0 g6 {$ N& B! `6 _! L* a5 Z
& K' N q1 r& }- { IAudioMeterInformation = interface(IUnknown)
* X# g1 F, f$ k+ D$ V l - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
3 C/ i+ O; E9 r2 {, s0 F - end;}
9 k# J% N$ m* s4 J - & ^# R: ]0 }5 r- R, X2 z s
- IPropertyStore = interface(IUnknown)
3 ]! h2 |6 T; t( G' @9 }0 P6 Z7 \ - end;
" B* o U2 G6 b
" q" X) l/ Q9 v5 U1 K. k' j# F% p- type' K4 f1 g% i0 _7 |0 m7 g# s2 a
- IMMDevice = interface(IUnknown)2 X# E( F9 {/ Y* r t3 V* o
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
% W6 z- d& w Z {5 ~! t \ - Function Activate( refId :TGUID;- M" u7 v$ o& R3 I! r: L" m% ^
- dwClsCtx: DWORD;3 X: _; C! {* `& Y8 a# q. B4 V; R
- pActivationParams: PInteger ;
+ A9 u) x# g$ m" i v" X - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
b# f. j, D' e2 |* z3 \ - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
) R+ Z& k( B3 b7 M) [ - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
9 `8 k5 d- R4 G/ E- p5 a1 {5 R - Function GetState(out State :Integer): Hresult; stdcall;( s8 b8 M; @6 S" v+ w
4 I; l" z3 Z; U1 d( }; x" N- end;. m3 ^& K: F; o4 c. G9 Z
' `3 H* Y0 ]4 q: | T8 g: _/ t
1 m" l7 O! T3 g6 H* m- IMMDeviceCollection = interface(IUnknown)
) Z0 U V% |( g, p; e - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
; W2 g) `* Y- R3 ^$ e: b9 o - end;
, L! v+ ]0 O0 @/ F, j
8 p# S4 i2 k8 A1 v) O8 q8 L5 }3 K- IMMNotificationClient = interface (IUnknown)1 Z, h7 |0 L% |2 D; v
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']0 w# H! ]$ V" f( \4 [" i
- end;: c; E' v- I5 H1 C: L. w
- 4 ?$ N6 V# P! ]: M* M
- IMMDeviceEnumerator = interface(IUnknown). H' s# e4 G5 H; C3 v. v
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']$ `2 P, @% w% _. w) N
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
6 R5 A+ a8 U: p9 F8 E* D' h$ N! G- h; Z - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;( _" c2 E! Q0 j; L7 L, W( m
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;" g5 b T1 L4 r0 T* e5 \# O
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
9 i. R8 x4 i/ W1 [9 W! e6 Q$ i - end;1 I/ I( X0 E" r( W* j
- 8 t1 P/ U- [/ S1 r7 c
- implementation/ l# ]5 x9 [7 D& y) P9 Y. @3 v7 V
- end.
3 q. w. K" g2 e9 l/ R( D - 3 M- u0 {1 u3 s# D/ E
- Thanks & Reagrds,
/ @* \! u8 a$ [' e% B" L: k! [ - Mukta .... V* s9 N4 R/ Q5 C: ?& @( ~
复制代码- , C9 j* V# I4 }
- it's work in Delphi 7
1 j0 B2 c b2 p8 e: y% ~+ H' [ - //////////////////////////3 R. Y5 j1 o( S5 d8 }/ b
( D- `3 f" K$ f) ]: G- unit MMDevApi;; C/ y( B& f7 h6 q) P
- : ]8 @9 o2 q2 H2 L+ {" h
- interface2 c9 x1 J0 o' n* ?* `
4 b {7 `' A0 O/ R0 g% l; `- uses
2 J7 T6 R8 Y& ~, B. p - Windows, ActiveX, ComObj;4 L$ C" N, G% Z5 ~
- 6 u. f! a/ a, o7 H
- const
6 m. h* i& D3 i4 A8 f7 _6 K- W - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
+ M1 x& R8 a' T. X! [ - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
5 \1 q; H- i7 Q: N' k- j/ m - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
+ _ a" ?/ b6 `# k5 q7 C! Z - IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';7 F: U/ [3 W& U
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
: ~5 j/ Y( O0 x - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
1 } X1 |* Z& w; T! ] - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';) `+ {9 W8 N# v+ \! j
- & n! C) P6 I+ k+ n4 |
- DEVICE_STATE_ACTIVE = $00000001;0 F$ H! U) Y# z
- DEVICE_STATE_UNPLUGGED = $00000002;+ E+ c- H& a0 [, e3 i1 Y% f
- DEVICE_STATE_NOTPRESENT = $00000004;7 |* B, J4 P$ E' ]
- DEVICE_STATEMASK_ALL = $00000007;
; u6 b; N* ]4 w
9 A8 k/ K; J" K% [- s- ~3 @- type& d: H6 Q- G& s2 j
- EDataFlow = TOleEnum;
% l* x$ m7 R8 y- `, e - ' ] |0 B" }, ^; M ]
- const
9 p$ `4 @' f# t' O- z) t8 X+ }: x - eRender = $00000000;3 H! N: y+ x) v& I. Y, `
- eCapture = $00000001;
, j/ I2 i. D' f, o2 T5 R - eAll = $00000002;: n0 [4 I% ~8 Y( ~
- EDataFlow_enum_count = $00000003;+ g0 S' E) S, T( g/ F+ ~, ]
8 |/ r7 J6 u6 I; C' C- type
/ m# a, j U& M* P6 p( w - ERole = TOleEnum;& D- m- \; f3 O5 k7 H5 t" r
- ; F, T9 g* W8 u6 n4 e, u
- const
$ Z# e8 ]: m$ F5 V* Q% G - eConsole = $00000000;
' H: K( ?; ?' k T7 M2 l% O - eMultimedia = $00000001;: y$ ~ ^: L% E2 }3 S, y" [
- eCommunications = $00000002;" y0 @, B- K6 r- {9 L
- ERole_enum_count = $00000003;
3 O5 [- s% A& @0 S/ u
& x% g g2 I& q0 {) |0 o" |+ p8 [% I- type- T! g5 F- U5 F' w
- IAudioEndpointVolumeCallback = interface(IUnknown)5 N3 t9 t4 X2 W% c" T
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
4 m9 q2 d. H2 z& ` - end;4 z" o- U" h: K9 w
2 g$ c3 B& }3 q1 r- IAudioEndpointVolume = interface(IUnknown)
1 d: k3 l) {+ h - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']5 u5 X* |. F+ I3 k* Y9 t( \
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
% n8 f3 r6 g3 w& T8 c/ B' i - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
, Q w0 ?+ ~7 b: ~$ E - function GetChannelCount(out PInteger): Integer; stdcall;4 j4 v; M! o7 t$ ~
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
8 n) @) ?2 V. C9 ` R1 g' R+ ?9 S - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;$ b' k% a( [! {# a$ Q3 |
- function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;- ?6 b7 E1 J5 X$ F% V R: Y3 b
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
7 a1 o/ c& h: m, v* m y. P( s - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;! @& M* }0 H5 g7 N
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;1 V3 X& O7 |8 Q! X& Z
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
- F( _5 m/ d' K# s6 U$ | D0 [ - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
x7 O+ r7 G; l/ H - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;5 \$ |- b' H5 G. F7 j5 Q) r
- function GetMute(out bMute: Boolean): Integer; stdcall;( X4 Y% F% |3 X
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;# @3 z+ l1 Q. C/ u% g
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
6 C; I. R8 h& k E4 s! \ - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
+ \, P6 Y8 a$ x$ |/ ^ - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;: I5 z9 Y- Y1 G" W/ ~0 T9 c. Q
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;5 |# m6 g& w: M, y1 l
- end;7 o" f1 l1 Z( G
- , i e; ]( {* P R! g# `5 Z
- IAudioMeterInformation = interface(IUnknown)
* a5 r; ~, z& [ - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']. K$ a$ N) O2 x* s* A$ _; s; w
- end;7 U/ d- l+ z$ X' t( f( T
- 7 M. z+ Z$ u' V; ]2 O8 T3 e, u
- IPropertyStore = interface(IUnknown)
- L$ T3 b, s1 x u+ y/ w - end;
k: @! t! x* l8 R& Y - & }5 r4 L: Y/ I9 u E( O
- IMMDevice = interface(IUnknown), H" \2 |, W& }. h, Z% _
- ['{D666063F-1587-4E43-81F1-B948E807363F}']6 ` S, ?" u' j( S9 y4 `
- function Activate(const refId: TGUID;' P& C# B. B. p1 ?4 R
- dwClsCtx: DWORD;/ v: s: H; x" k: e
- pActivationParams: PInteger;
- [& ~- t' g; p/ g# J - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;$ @/ y: p% N7 S* m4 K4 L; R
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
1 E& `9 q/ {, j! f - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
1 B% U4 b% U/ j - function GetState(out State: Integer): Hresult; stdcall;- C5 a: _5 w2 z3 T5 N% M, |; u! m
- end;* U7 W1 k- i9 N5 `5 J% i6 K3 s/ j
- ' h4 r7 ^7 H3 @
- + n' \7 u5 v, M, x9 S
- IMMDeviceCollection = interface(IUnknown)' B8 l; X4 b k2 r# P2 ~* w
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
: X) v0 n- A( _. g% ~% ~ - end;4 Q! [7 }& x9 _. ~
- 1 I4 I4 S5 z5 h# }% p2 q. q
- IMMNotificationClient = interface(IUnknown)
/ I3 Q7 D# z( z" I* }2 w0 r3 s! q! X1 ~" R - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
4 P& b: E4 o \( s* F- G# `. g - end;: s7 T6 h/ D' H
- * k: h! {" D% E; j0 {3 C( Y
- IMMDeviceEnumerator = interface(IUnknown)! z7 ?3 s9 i; J, q5 [2 I
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']9 ?; d% }, m+ U8 P0 r5 |& D
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;* ?1 l' J$ o/ x8 d9 A
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;1 j$ k! K- l+ b# j% [: R. J
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
- Q0 N1 w( Y3 r# b* f$ R - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
5 D% y9 a, Y% n' T f" j - end;* q) n9 l: C& C: Y
- # j6 ]1 |5 r! Y( A7 [2 M" T; ^
- implementation
) \6 y4 s; m0 w' H! M2 u - 1 A* E3 ^/ p3 G1 x, H* i z! s
- end.( e8 N# g' O0 v l/ S3 h2 ~$ `9 M
& Y* g: U$ Q3 L( q- G9 D- ///////////////////////6 L9 t! m* b! n+ j' H4 K' F: y l
- simple sample :)# y) L. S+ t( ?! {. F
- ///////////////////////
0 [' e2 z5 o; `4 N - ! [ e! r! T0 ~: w
- //...... other code
1 o& A7 D: H. i# ?
W) `. P6 t! q- uses ... ActiveX, MMDevApi, ...;4 R) o' t& d+ O. [
( |2 g+ q! o3 j# B5 j* D- //...... other code
* Z2 c( F; n4 A8 B# z5 D5 G6 C$ l
/ o9 d/ p3 t2 W W6 {5 I5 U" u ?- var" Q; O5 V) N% s4 A6 ~0 i5 X
- endpointVolume: IAudioEndpointVolume = nil;! n( v" n+ B- u- s* z B0 l: E
- . l( B; A$ W5 E2 b& F: Z
- procedure TForm1.FormCreate(Sender: TObject);; l. m! m5 n5 ]4 S
- var
/ G5 c6 l0 d$ O5 R - deviceEnumerator: IMMDeviceEnumerator;; M: p) F; }7 h6 x0 }
- defaultDevice: IMMDevice;
C& T) H+ H; _1 ^1 T* ^3 M, M E - begin
9 `) }. |7 F/ `1 Q/ u - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);1 T; v4 j0 v! Q, U
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
/ g6 ^ K- q c2 }! _; `! y - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
4 N E' |- H2 U+ E; c6 K1 A& _ - end;; K. Y# Y8 B; P: q/ N
" V; E* P" O( p" H- procedure TForm1.Button1Click(Sender: TObject);2 ]+ K d+ T, p) N& h2 U
- var
3 b {1 Y9 x! R. ]+ p/ i - VolumeLevel: Single;( |0 ~* [; u- k) q3 w) _
- begin$ N2 v3 M8 T9 b: \
- if endpointVolume = nil then Exit;
' v, w- L% ?$ J& Q+ U, u - VolumeLevel := 0.50;
2 \/ w* \8 J7 G0 z6 C) k& u - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
2 Q4 T. ]- c7 v, j6 ]: P - Caption := Format('%1.8f', [VolumeLevel])
$ p2 [% g; A% H6 T5 a, Y0 _; ]: B - end;
' s; p2 {/ @& @9 Q, V- ~0 A
/ e- I a6 F: C6 N- J3 \+ E* {% b- /////////////////////////////////////
) v, u8 O" u; u' M
$ C; N$ C& g7 S$ n- // with best regards ToxicDream5 x# m' p' d$ \5 ]5 T
复制代码 |
|