|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0584 m0 o- n: n1 o% C$ ^5 `
By Mukta & ToxicDream- % V& X `) d" P9 A; X3 x
- //for delphi 54 e, B. w: ]" R' q _
- unit MMDevApi_tlb;$ d! H6 c, |% g( m2 V" w
- 8 J$ p4 @/ r# O2 Z- J8 U' h0 }9 E
- interface; X; F2 e$ S0 `0 E, Z
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
$ E+ M8 s' m5 j6 ^% l, Q - const
+ w" R! \) o$ L% ]3 { - // TypeLibrary Major and minor versions
' g$ m1 d# z" ]. d/ x6 n - p6 r8 g, K+ k% g. h- {
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';. i n) v0 |' }0 S8 J& ?/ T' f
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';$ `; I: J( k4 K3 @% f- t2 ?
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
: _4 G* C3 n6 K+ `8 \" L) o9 P - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';% V+ R ]$ s, K# X; s5 H' S: O
- IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}'; T5 p8 O$ X/ h% p( @1 H, k
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';2 w4 n6 _4 R: `7 J Y r) `7 V2 P$ b
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';3 w( t) H2 o# D
9 f4 \( m/ X% K; S: S: O- DEVICE_STATE_ACTIVE = $00000001;
. T, M0 P; A2 U, K4 q - DEVICE_STATE_UNPLUGGED = $00000002;
5 z7 C4 B. }6 V! q3 g5 T - DEVICE_STATE_NOTPRESENT = $00000004;- e0 w( {1 ~0 w3 Z
- DEVICE_STATEMASK_ALL = $00000007;4 J4 c% @' R6 P
- 6 M9 l- [7 J; I0 d+ Y: Y. o) ]
- type8 A9 a1 d/ W& z) k- {: f) l% p6 w( {
- EDataFlow = TOleEnum;
% d, {# F4 E; I7 S; t% o F - const# n+ Y o/ i0 B. a
- eRender = $00000000;# w* P. Y, O9 \. v# J- i
- eCapture = $00000001;% y( e! Y8 Q4 K# p
- eAll = $00000002;
J, R: n/ s& D - EDataFlow_enum_count = $00000003;
! { U( z8 j5 M# C
0 [7 F! c- i. U+ C0 ~1 O- type
- t4 r% U& y' A) e' B - ERole = TOleEnum;& ?. O- P- a; Z! Y9 K3 z7 D
- const0 Z% n4 e5 b9 ~0 T- }% F
- eConsole = $00000000;
0 J! D; W2 k( G1 A% y& O0 e" o7 E - eMultimedia = $00000001;
, w2 e$ v& x" _) U - eCommunications = $00000002;
7 E- A( ]7 v2 r0 c4 E4 S6 ]2 } - ERole_enum_count = $00000003;' z! G+ f/ C/ K/ k1 E
# n0 T1 X, Y1 m4 Z0 r$ ?& X# v- type9 O# W4 t% l, M9 O3 l2 T$ w$ _
- IAudioEndpointVolumeCallback = interface(IUnknown)
1 u6 q: I# _ y9 B - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']1 M, o# m: ~: ` }
- end;1 H7 _- _ V* f! m6 e
" H! G+ M v9 v; _7 T- IMMAudioEndpointVolume = interface(IUnknown)
; u& V" O- [. s( ~0 m - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
+ |3 l, H) B F* O- B - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
0 }9 B' Y( g) `6 \$ W2 u& D - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;8 h8 X/ S4 M3 c4 R
- Function GetChannelCount(out PInteger): Integer; stdcall;. ~; l9 E' O, U/ W5 q: Q; p
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
1 i- h0 p b3 K* p3 ? - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
& V. d+ |0 e( {5 E% [/ v& g - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
# N6 K8 U9 W% m4 }+ ^ - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
5 f% H/ \4 e {( O1 } - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall; P+ [5 R+ x$ ?# H6 i
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
# k5 A7 W" t9 e2 c2 E! J3 v0 ] - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;+ t2 C2 Q6 W0 C8 ?3 z) A
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall; \, y' z# p( e8 N7 P. a3 c
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;4 S6 s: k: v0 S' k2 W' a( |
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;! }+ @# e R$ u8 t7 g; M- |) U
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;0 K' ~' \) E! Y! {+ k' s
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;; y/ O8 x3 Q, D8 [
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
0 s' C* h; _. [ - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;- d% F0 k% k- h6 [% q
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;% r5 t6 |5 {/ P. ^/ X3 E
- end;: z" N# e/ G3 ?5 J2 \. B7 B
- 9 t3 G! ~+ |# X
- { IAudioMeterInformation = interface(IUnknown)
; L0 C- t; q3 k. z4 r" a - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']3 N2 R9 n$ @+ F1 a$ j! \
- end;}
, k# ?8 k, P* l6 x8 t+ c8 N h - 7 L: k0 z$ i- j' A/ C) X d+ o
- IPropertyStore = interface(IUnknown)
! L' B- K$ x4 b - end;& c2 n2 z3 M' n" ] s
( @1 }" B+ s+ `! [- type
& T+ i9 U3 F9 y* V - IMMDevice = interface(IUnknown)) W5 Y" T; n$ u+ x2 Z) f& w
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
! \1 X8 g2 t% o1 V, ] - Function Activate( refId :TGUID;
# g1 {2 N2 R. _$ f. ?4 P, d' E3 \ - dwClsCtx: DWORD;
# R' y' X1 |- c* }, d+ l - pActivationParams: PInteger ;
5 u1 D& s, N8 U+ E3 `6 i T - out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
+ R! j, r1 n$ ?: o! k# P* W8 c3 ~ - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;1 p# M0 ?0 O; u/ A! W0 O W
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
" q# a. M- ~* r6 R6 p; k) }0 m - Function GetState(out State :Integer): Hresult; stdcall;
% o+ ~3 Q: R% {/ Z* }: j- D6 |, _ - $ ?8 y s* n- T9 U6 `6 D) L) Q0 ^
- end;* y2 a& R9 L$ ?7 w
* `+ C: f6 w/ Q# D" X0 \4 v- 3 G, n! {' s Q; Y7 f8 v
- IMMDeviceCollection = interface(IUnknown)
# C e( ` c. v6 ?: j% Q - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
- ]1 ]2 B, O% f - end;' e) q' h! `& p2 {0 Y( ~
% O& o) t; [9 q5 e. I( b& J- IMMNotificationClient = interface (IUnknown), d. @+ c: p$ \" h6 I
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']; }$ N# w! X& z8 A$ G3 h6 Y
- end;" C3 Y9 L! u" r. K6 F
- & L/ d. i- w# N" @1 {5 ^, Z
- IMMDeviceEnumerator = interface(IUnknown)1 F& u% G4 P- L8 P3 W7 i
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
. w0 F M) ?9 C* g) Y& K - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
& s1 F4 {9 F, Y1 W0 O" r - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
3 H4 c e1 z s: N0 p - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;+ T6 C! z8 x0 ~/ O1 f
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;/ B3 c3 J! k6 X9 r" B. Y9 u. L
- end;- q$ \& o, ]" x/ |
4 K2 i. X2 i# b/ T- implementation
/ f `0 C2 A6 } q - end.
0 U1 F! u: N; |' M/ k - 3 b( G3 n7 k! f, f' Y
- Thanks & Reagrds,
& u; V2 i1 c. _0 H; w+ X5 Z3 E - Mukta ...* d: d& F5 Y9 l+ J, Q4 E
复制代码
; F* M4 s% I: C/ n2 x4 t- it's work in Delphi 74 Y; y4 O- _7 `) X* M
- //////////////////////////) C3 @3 ^' I, Q, l% E
$ q# M# ^" L6 v- unit MMDevApi;. ]& C4 U3 ?& T; c! j4 e- b1 O
- " B, c3 p8 h( A- a
- interface+ A" T% F4 |* m ^
- ( A |& _5 r F& G
- uses% {4 A$ G/ ~7 b; Y; D! R
- Windows, ActiveX, ComObj;' T& @ P7 f1 q( E1 n- f
3 I; A: T+ ?4 N: Y' S2 |- const
* [3 ]& |7 E9 i - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';- `. Y+ Z: v3 B4 ]
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
- \: u6 Y$ ^# k* l/ h; e* _* { - IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';, n1 W6 t4 P7 H n( f
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';( Z7 {7 ^4 w2 `- x. U5 W$ m
- IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
1 K8 o# W/ k. [- c! \( Y - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';' V9 ~) }) i; b) {3 h; n
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';. }' i4 B1 M7 p) J2 m
- 3 R t$ [6 r" x8 K9 p; j9 Y* b$ o
- DEVICE_STATE_ACTIVE = $00000001;9 _ m& I- a6 S2 Q g2 Y3 q) a- T+ D+ y/ p
- DEVICE_STATE_UNPLUGGED = $00000002;" y. P# b# L0 t% S0 f* l
- DEVICE_STATE_NOTPRESENT = $00000004;( \5 C9 I$ m0 E# g/ N7 u9 W
- DEVICE_STATEMASK_ALL = $00000007;: F' G( p7 o, Q, z9 }6 X
% i& D% o& a2 S- type [% F, g: G" b% G' u
- EDataFlow = TOleEnum; Q/ o! ]( N* G2 C: H
0 b( Z' ?( y+ `$ V3 ~- y6 K- const
; @" k5 x/ y& ^ - eRender = $00000000;
; v8 ~" c# b; _0 D - eCapture = $00000001;6 U' e3 {( `$ N+ o" _; i! a3 k
- eAll = $00000002;0 g2 ?/ K) x/ m1 o- p6 ?
- EDataFlow_enum_count = $00000003;% F% }/ m9 W3 |! N2 k$ Q
- O9 u! S5 A' _9 H8 o
- type+ A/ h7 ^. `4 \# x m
- ERole = TOleEnum;/ [9 a% Z: T1 f! P* x
- , @% p8 N7 Z4 o$ x( ~2 q4 W3 g
- const
5 p- N F; a' l- v" Q - eConsole = $00000000;
1 ]8 J, E" [7 K/ W+ | - eMultimedia = $00000001;) }& u# `3 U# u$ q
- eCommunications = $00000002;! L" n' s2 A# e
- ERole_enum_count = $00000003;
- o4 n7 y+ P3 ~ N/ l$ y+ N - - g* z" V. _; B
- type
9 K+ _. n2 q! v7 T5 P8 n9 o - IAudioEndpointVolumeCallback = interface(IUnknown)' I+ ?# w s" u/ ^, G% @. ~
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']( A& C& |6 R4 j4 i y& q
- end;
* v. o! w! M. {, T3 H& | - # b6 c" z4 f- n* N) @
- IAudioEndpointVolume = interface(IUnknown)
+ h( V6 Z# z& o4 l8 P - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
8 H, H5 j* y- z. J' w, T: P' o - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
9 l; U# S1 q- \2 q - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;( x; e- `: P x' G, b
- function GetChannelCount(out PInteger): Integer; stdcall;
: w+ s' Y0 z& h6 U0 d - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
7 L' c! u0 y) w* k, G0 ? - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
( I; U0 J2 L: t Y# U& X, f, N - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;( z* l6 c. C7 W8 w* G
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;; Z8 l* ?* n9 B& P$ k
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;* f! z% A( C F: |4 F1 A: r
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
2 Y9 O7 S( Y8 q9 \4 Z - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall; |" B, U+ G, V
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
8 u6 @1 ]) j! Q1 W0 I1 a+ U - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
6 z6 g+ z0 `9 \. g% j7 K# E - function GetMute(out bMute: Boolean): Integer; stdcall;% Z' E' N) V0 N/ ]) U6 m# n; L
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;* A, i) V( o# A3 H/ t- e
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
) x/ _& x1 J4 m, \# {* X& _1 H - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;. g! O: b* W& V3 W
- function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
4 y/ g- w" _$ C$ v - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;) _8 p/ x R/ G9 B
- end;8 N2 v8 j5 x+ K6 [0 C i
- 4 T; ?( A. @0 r4 ?1 v1 I
- IAudioMeterInformation = interface(IUnknown)
4 h8 v# W- j4 y - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
# s w: r) ]3 d- E; l7 j - end;$ s& e! p) y& @/ P A* ^
- 6 t: g/ \: |" @8 o+ X7 E% M" Z
- IPropertyStore = interface(IUnknown)
: Q& i1 H8 n: M' B3 U, R - end;
, V* j. B7 N8 L- y* A) @' c - 5 v4 k8 {2 G- b. J. X; B6 T$ v* `
- IMMDevice = interface(IUnknown)
8 W0 F) Y& Z0 P. `, B+ \7 W s; Z; u9 s - ['{D666063F-1587-4E43-81F1-B948E807363F}']- u2 f: Z& s0 o! V$ ~ o
- function Activate(const refId: TGUID;- d/ `; n3 t5 j3 I" b5 M
- dwClsCtx: DWORD;
# o0 c' m8 c* {6 ~. f+ t - pActivationParams: PInteger;
/ y- g: q) y( ], q8 w - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
* w. A, \1 P6 \& g6 f - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;2 {$ q! P$ y5 p* f8 g
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
2 f; E5 m: ?3 n% P. E" C - function GetState(out State: Integer): Hresult; stdcall;! \1 v1 R5 G" S4 B3 a# Y4 g3 H
- end;
+ p# Z7 a" b. i" r$ \5 {
5 k7 H+ e' a+ J8 u: {6 h$ B; `- 4 u0 g: s7 N; p7 h
- IMMDeviceCollection = interface(IUnknown)
9 |; n: a) S, g8 h+ g - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
- j. ~9 P, K1 B1 j' g3 a6 W1 ] - end; O! x- D$ A- P( x
2 d* J- ~4 A* A9 _. k- IMMNotificationClient = interface(IUnknown)$ {$ S' h! X9 o
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
* n. `* ^7 j5 g/ W l {3 {! I/ \ - end;
6 U2 U9 x# B$ ]1 p% _4 a4 e# a - ) e5 L) C6 i& `! b. M0 \# z: \
- IMMDeviceEnumerator = interface(IUnknown)" c8 J1 T- |3 n, t$ d- h& Y
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
# ]3 [8 D* h9 v1 f( h; K A- T | - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;" y) m8 }& m8 [" z. `- E' I
- function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
; Z z) n3 q# U* A9 j2 } - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;, Z2 `/ T) t% d# o3 j# }
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;; W$ S. g0 e- y' d5 R# q! ~
- end;0 M$ x. n: P$ C+ }, p/ ^7 R
' a# e- W: ~! S- implementation
4 p) D% @; M% {# z, |! M - 7 n" f1 M' P" a' V6 O3 q: v1 |
- end.
2 ~9 E/ V' j# X: L& ~ - 3 V8 y m: b$ m" X" F, ~; N- B
- ///////////////////////6 N. \ C; l2 r6 _8 b# Q: K
- simple sample :)' J. s% f) \0 K2 V) b9 W$ `: N
- ///////////////////////, h4 Y. p+ q2 y! T
% t, s# y& ]7 t0 G. E- //...... other code
* T% f: o0 Z1 D& ~; f: X) K( o - : U- G5 h; q5 @0 A' M
- uses ... ActiveX, MMDevApi, ...;& O& `. X c: u) ~. k, M- C5 \5 {
- / d! C/ ]5 z8 E v9 h
- //...... other code
5 J0 U* U4 h8 n; j3 ^: o
0 S' ^$ }, E- @" q( _5 E0 a: a- var# z. O9 u" ?: G4 n- T0 O( [1 F
- endpointVolume: IAudioEndpointVolume = nil;
: s& e8 `) i& s. U) J
4 d! k. u1 n' u; S- procedure TForm1.FormCreate(Sender: TObject);; V& k* m7 t4 U3 Y1 l
- var
$ o5 i& V) u& o$ |' F8 T - deviceEnumerator: IMMDeviceEnumerator;2 J# Q5 C1 G3 N8 V8 \
- defaultDevice: IMMDevice;" @5 J1 c! f6 A1 `
- begin8 J6 }9 C% A' a5 T/ c6 e
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
4 Z5 O, t# u( V. s2 B" U - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
+ T( V) I" b/ ?. T. {3 O4 T - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);: P% p. Q: F: J" A
- end;
2 U% s; [. R8 \* ^, v
8 k8 c* w$ h0 `( W$ n( J- procedure TForm1.Button1Click(Sender: TObject);: c& r$ a: |9 g1 D
- var
/ _/ t# o ^/ V- `: I0 o - VolumeLevel: Single;' F5 B- w/ w7 U5 x6 K m
- begin& Z6 A$ y& i/ `
- if endpointVolume = nil then Exit;
. V; |* c, V3 P - VolumeLevel := 0.50;; M* b9 Y3 O, \: v8 o
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
) w% H4 ~- O3 h - Caption := Format('%1.8f', [VolumeLevel])
+ p8 C! i. r8 Z5 {' Y; v9 i: W - end;
6 p: }; b9 x. A - ' [9 `1 s. x% H
- /////////////////////////////////////2 b4 ]) _3 _4 x# X. b# M& p
8 p: p+ j8 F/ g$ g$ i- // with best regards ToxicDream6 B- y5 w" b* |
复制代码 |
|