|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058
r; G+ Y# Q7 }2 b$ LBy Mukta & ToxicDream- - O2 }6 K) e0 M0 c9 p
- //for delphi 5# }0 e7 L. h, {5 g) ~0 Q7 S; B
- unit MMDevApi_tlb;$ `9 A# _; _+ c5 u8 |$ g
- / s- ?3 t' I) M4 a& ~) D9 |
- interface
K8 H* @' \% Y. @ G3 Q4 `3 i5 n - uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
6 s% V2 e! U* \5 y - const, u6 _% z$ X1 V. G/ j
- // TypeLibrary Major and minor versions+ j8 B* v- X; X v9 E
- 9 [ S0 i% T/ Z$ y$ o
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
) @ Z1 [. O7 x% A4 b; { - IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';$ Y+ D) l! W- R* G* j
- IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';4 `( [4 U- V( L, I
- IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
% n/ `3 m$ A, |0 e( { - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';$ E+ k; @3 S4 E
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
1 H; }% E/ {: v% V0 r - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';$ b2 c- p T- Y/ U
9 e3 _- y3 S; }* Y- DEVICE_STATE_ACTIVE = $00000001;- k" _) `6 p# z5 a
- DEVICE_STATE_UNPLUGGED = $00000002;1 C \; B( f$ J4 a
- DEVICE_STATE_NOTPRESENT = $00000004;
4 r. b& t) [& A2 _+ A) u, g - DEVICE_STATEMASK_ALL = $00000007;
( s( z$ ^4 T/ L1 b/ G) K2 [ - ' g' w; B% ]! z
- type9 r2 z% E) | _8 f) B& q/ D: h y
- EDataFlow = TOleEnum;! V+ x+ `5 E6 G6 i4 f
- const( u& o+ G, d7 l5 S/ x" k
- eRender = $00000000;# w! ?6 K6 o7 ]: G0 H- t: k, x- @
- eCapture = $00000001;0 [% h; F8 l8 v2 W2 ?2 B5 |
- eAll = $00000002;
2 T; c$ K% |2 |6 [2 k - EDataFlow_enum_count = $00000003;
. E, d0 t9 g8 g6 B& ?) c
$ ~( s6 S1 W& Q- type4 M+ D+ w1 \3 U7 h6 _' P
- ERole = TOleEnum;
/ m- S$ F/ z1 K* v( m - const; y( b, ?, h0 {6 M
- eConsole = $00000000;
" u4 U. [; j' J8 j3 S* H3 `* f - eMultimedia = $00000001;- ?, x4 m* W% N9 H! P* r4 I
- eCommunications = $00000002;
4 r% ?0 H" p* d7 _6 G2 |8 R - ERole_enum_count = $00000003;
' k7 Z3 b" ~& k0 Q. P1 e
. o# `0 p( Q8 p- type
$ K% D) t2 R7 U - IAudioEndpointVolumeCallback = interface(IUnknown)' T5 D9 [- b/ V( D+ m7 t
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']- N, o/ V7 n9 t8 g& @6 |
- end;% z& ^ m7 p/ y. l
% _$ ]' B7 i: ]1 u& S0 j- IMMAudioEndpointVolume = interface(IUnknown)
( z7 x+ P; v' r. } - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
. s/ p2 Z2 S0 H4 V7 R* y - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;0 q6 p( {2 d! _6 P! v9 [
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
. P; R6 W1 u/ D. x2 L8 _ - Function GetChannelCount(out PInteger): Integer; stdcall;) h9 L& M! L$ H8 W# |' K( k
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;% V; y" W) {7 E
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;; h4 R, K" }' `
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;
1 j- {1 ~, `- j1 h: _3 k( w - Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
9 s% Z; J% b0 Q0 Q - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
. Q% E1 {( M8 _ - Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;+ A% V4 [7 s4 w+ H; ?
- Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
9 u' S. y0 [4 k! N' O - Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;* E. q' a: f" M2 Q" |9 v. G4 Y
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;* f( B5 |3 Y5 z
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;
& r( h+ o! _# e3 N% {' S/ E - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;' v' n! a6 I; a6 D" l# @5 q/ o+ Z% b
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;/ ^; u/ b# b5 Y) ~4 [
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;3 t/ W! }3 y1 F+ D. r3 @' L( D, g
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;5 h- e8 C$ x- Q7 O% @& `" b
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;0 Y# E5 a/ m) o( x8 X" c
- end;
z/ ~2 F; k) x# a
1 E8 U- Z- t( C) O1 [- { IAudioMeterInformation = interface(IUnknown)
4 C- c( a; G. @3 O/ f% x$ y, r - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']0 q& A! X1 t$ r
- end;}
_8 D1 ?5 [5 v0 K% J) ^ - 8 _ n. d; @0 [- L5 U
- IPropertyStore = interface(IUnknown)
6 N) \& Y- m: _% D% B+ P - end;
# } C& W ~/ ^5 Q+ Q I! @
# f3 `$ G9 a$ L- type6 ?- ~) V1 B$ A, V. {
- IMMDevice = interface(IUnknown)
7 ~# j) }8 m# \ - ['{D666063F-1587-4E43-81F1-B948E807363F}']1 ?+ e) Y- o) i! H% o3 r6 ?
- Function Activate( refId :TGUID;
8 c2 q9 ]0 x( m3 X$ H3 F% X$ Y: Z8 `' ? - dwClsCtx: DWORD;
- A4 Y! M v6 _ - pActivationParams: PInteger ;5 i. X. n2 b& C2 B* N& z: s9 ^7 I
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;4 Q1 k) i" s% A+ M% z
- Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;3 q1 C9 y: D- W2 Y2 F2 L! g8 {
- Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
2 [* H- Z7 Z! E" D; B - Function GetState(out State :Integer): Hresult; stdcall;
$ d0 p& J8 ]2 p N A5 V7 M' J$ Z! n - " c& {$ ]& G/ z# H4 X
- end;
5 C+ a8 n- d5 F& D! F2 @
& ` L, M" r2 D% x! E- : X: W* o8 y2 H8 e D3 e) Y
- IMMDeviceCollection = interface(IUnknown)
$ x i) V' w9 Q - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']/ j+ u! K1 l6 y6 |2 L D0 |2 H1 ~! z; H
- end;9 o, d2 A! u0 c' v4 B
$ y7 m5 ^* Q1 Z( G8 d4 l- IMMNotificationClient = interface (IUnknown)
+ ]" K% F1 {) m* E - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
# A0 R0 L: W* R/ ]- P/ b& X - end;- e5 L# M7 A0 w
* S/ a8 }5 c: V- IMMDeviceEnumerator = interface(IUnknown)6 U/ q: G @- p, e, K
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
+ _ d. w' [7 G ^4 P# `8 i - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
x- C- U- K9 c% `: U, A - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
) r" d' b: r. m P3 F+ z4 a2 z - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
% B" y7 `- p0 `5 { - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;: \% H0 _' E6 D8 u8 z
- end;
% _9 b+ A8 v4 c- @5 X - 9 Z- L: ]" v9 A& Q
- implementation4 o2 ~5 N/ F" L% z
- end.
) E! t1 t2 S6 o" O/ K
5 A; @$ d; z1 f0 x. q, F: M- Thanks & Reagrds,9 D+ _2 V5 S7 Y$ ^+ u7 j& g
- Mukta ...9 K% \# P# L" L& O
复制代码- ) f3 B/ ~4 Z' z D2 V3 t
- it's work in Delphi 7
: }9 W+ x4 v2 B _2 ?' q - //////////////////////////6 A7 A1 R+ n' Z9 F0 a* q' ?
6 I! }! ?( ^. k+ y- unit MMDevApi;
) H T* K$ v) l/ m: ^1 q" X - + Q, B. z4 C7 I+ P% [$ l
- interface
! W$ l1 E+ x2 ? ]" A - & M& s \8 L9 X- x7 A
- uses
/ ~7 h7 d. b% Z5 L - Windows, ActiveX, ComObj; \% Q' ]3 P# Z5 k' p
- & v7 `6 x2 w1 m/ a/ s4 D8 Z
- const& O6 m) F" f8 k2 [
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';; r1 n# ?6 a$ E5 Y' R
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';# }) w5 o& I' d9 N5 u8 B5 U
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';6 x3 v' H S( e. o% \
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
/ Y( a/ b! _1 o$ N c. @5 _ - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
- G7 y% _+ [% w$ k4 [ R - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';6 \. ?& M, N8 u2 R$ U
- IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
6 y1 b& X- |, p2 u - ( w( U S% N1 d$ Z, p8 |4 x1 ~
- DEVICE_STATE_ACTIVE = $00000001;
0 t% I. x" @6 V# \" i; j4 j: P1 d - DEVICE_STATE_UNPLUGGED = $00000002;
' @9 h" C- r6 G2 H - DEVICE_STATE_NOTPRESENT = $00000004;3 U7 ]; L% |% C( ~. L
- DEVICE_STATEMASK_ALL = $00000007;
& H; @) T; W( L6 ^7 s4 b" r - $ ^' u- H q9 _2 t$ G; q) F
- type) `" d8 ?* |/ d# X/ A
- EDataFlow = TOleEnum;
. Y/ A# {( Y& M: n9 x - + r8 w$ i- n$ q
- const
/ K' u3 q3 S' y: v+ C8 k - eRender = $00000000;) U* V" t/ h2 |; F" R, J
- eCapture = $00000001;
- v @1 \- k6 m - eAll = $00000002;2 C5 ?" z5 [' k ^! ?
- EDataFlow_enum_count = $00000003;0 y: M, Y$ |) h$ ]! O1 @+ v2 a
- 3 ?9 S( T" z2 i& N
- type
- u A& G p% ~2 d7 p1 E* g - ERole = TOleEnum;
) U& {) J! j7 p; s4 _" @
: H0 O0 D$ s7 O* t2 a2 B- const$ p& T* K! M% N! v0 i
- eConsole = $00000000;
" j( X& o1 _ T - eMultimedia = $00000001;
5 Y8 m& R- F& t; h) _" q - eCommunications = $00000002;
8 n/ Z' T# W) \6 x6 L& r - ERole_enum_count = $00000003;
0 d4 X# \2 `7 K; _: y - 9 o; D( m6 L- `' Y" L/ {! H
- type
6 f4 I5 {9 y) L6 O. i% \9 @ J - IAudioEndpointVolumeCallback = interface(IUnknown)
+ P5 T& p# w1 {5 } - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']. u+ f: v2 T0 ^4 w2 C- \ e
- end;
+ V. f# v/ [) \
, m5 p$ d+ D& B! [- T: Y( @7 S/ H- IAudioEndpointVolume = interface(IUnknown); f# a- S% i, ~8 ?5 Q
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
$ h# V# O8 x4 l0 R# H - function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
# u" I& a9 v; p* @* y% ] - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;: ?6 p. B; k; G) P, l/ f
- function GetChannelCount(out PInteger): Integer; stdcall;; W5 ^! G t7 D8 g1 \8 W
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;0 h1 C% o/ U1 u: o- |3 u E2 X6 H# I
- function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
5 f9 c, e" s" s - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;- U$ d" u; c% o' Y/ N
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;7 V1 c `( v! Q; `# u3 x0 \
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
! X) c. g3 g2 ^ - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;8 W% w4 I& E N2 q
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;5 s* f% |% c0 w; ]2 I
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
- Z1 y# ?' T r8 k9 ~ - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
4 K$ e' t( }8 P - function GetMute(out bMute: Boolean): Integer; stdcall;4 `0 o4 m7 d5 J! `; c T4 L: ?1 k
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
8 j; i0 Z' n8 }- y, h! o* V - function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;+ e+ w# M. b* U1 O" W
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
- V, C0 t3 Q1 U3 _% Z$ e% H: C - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
- J0 h f6 |4 s7 A1 k$ {) P - function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;2 b3 x* W/ U! R+ N% ]3 V
- end;) _; A" r1 Y. ?
- m1 `! a5 u& g" _2 t0 f
- IAudioMeterInformation = interface(IUnknown)
! j0 r e6 }( @/ M4 g8 n7 k1 e - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
$ `* V' o5 s- Q+ d/ B - end;( q- F% d" P, Y4 h9 V- E% ^( I9 r
. H" M6 e3 b- h7 b- IPropertyStore = interface(IUnknown)
* ?5 Z" ~$ B0 @+ u0 _ - end;7 ^( r% F& r, s
2 Y/ C5 Y) \* H9 z0 Q- IMMDevice = interface(IUnknown) v" e& |4 q+ O; Y" h
- ['{D666063F-1587-4E43-81F1-B948E807363F}']7 K6 \7 b6 |% g
- function Activate(const refId: TGUID;9 N' s1 m! H- m* J3 g6 Y
- dwClsCtx: DWORD;4 |( W4 m* q9 |# L, k3 @* J! E5 m" L
- pActivationParams: PInteger;
. a4 i+ q, Z6 Z) d) ? - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;) V( H% U5 j5 Y0 [$ \4 l
- function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;1 s4 J+ e4 h- w1 h) f
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
8 V3 j Q K! ?. k3 y/ j+ r - function GetState(out State: Integer): Hresult; stdcall;
4 D9 u" m- C$ [ M - end;
% X3 o$ G4 |/ l. ]" @& M/ V; o! _ - ) j; m& C& C; E# j
. W) H) Z7 P/ o4 |8 o4 j3 [- IMMDeviceCollection = interface(IUnknown)6 M" F R# W$ ^: g
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
$ b3 G* K$ N5 w% B! O - end;
$ s0 p9 `; E: F; e
8 U$ M" K3 z, Y# s( N0 r* e4 J2 s- IMMNotificationClient = interface(IUnknown)
1 f2 x3 W: G2 {& P - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']$ ~& z2 L! M+ M1 e
- end;
8 k* M, ^: Y9 L/ T m) Z6 ^
@/ A0 @$ D: m, b. d& A j- IMMDeviceEnumerator = interface(IUnknown)
' Z; [2 ?7 ^& m& d9 v0 S5 H - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
' T; F8 p. [+ u' K. W7 f - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
0 J' R0 l6 v2 `0 `7 K( i - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;& T, P; e) F, g U% {; p. ^+ W
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
2 Z2 q( {0 ^) G6 x$ V) k/ c - function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;4 u |- X2 B' |* H# n. t/ V4 ]1 v% V: O5 `
- end;
# D8 V; h, `4 V, @ - " t3 ]5 ^5 ?8 r2 N9 y8 b
- implementation
" }2 h; ?8 _/ {: J/ }$ J; @ - , a- z* b0 X( e7 v$ E
- end.! x E4 K$ `9 r: a5 F
- * I; G: x: \: U0 T+ k
- ///////////////////////$ `+ n5 P! g9 a! j# R4 K; \
- simple sample :)% \: s- u1 D' G1 f
- ///////////////////////
5 ~; \4 F; K& j1 S: }: g" _ - ! @: z) \( o0 J$ v8 b6 w
- //...... other code
3 z G, Y8 g. a8 o1 U; N$ u+ Q - 4 T! y0 [' \& X8 p6 G
- uses ... ActiveX, MMDevApi, ...;& D. M; d0 ?/ k3 |& g9 f M1 i
- * b- U1 `! V* j% a# Q; l1 f
- //...... other code
# w: a# y' I- C$ u2 l
) w- Y" s7 |3 Y3 J- var W+ [5 Y! D, }( ~0 S
- endpointVolume: IAudioEndpointVolume = nil;
5 y \) E0 d2 J
$ Y; x" F- \' w# t; b- [$ q- procedure TForm1.FormCreate(Sender: TObject);. A! b2 W9 [/ c6 q: o! _4 C
- var& [% S3 y. \- J
- deviceEnumerator: IMMDeviceEnumerator;
- d% A, b( A0 P - defaultDevice: IMMDevice;/ ~# M+ D" |6 A5 b$ @1 E
- begin
- {1 g5 K. c3 W+ O - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
6 f$ K( U% b8 a/ r7 y, p9 t - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
. N! D- o- O6 W - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);; T8 Y5 Z' a9 |, \9 Q
- end;1 M+ a$ r2 M- C; z: X7 x, ]
- , G; F6 r/ `+ V" m* z: i# j
- procedure TForm1.Button1Click(Sender: TObject);
/ [+ W: E8 o7 F0 V6 x0 _ - var
$ V* r6 o k8 B; ? - VolumeLevel: Single;
8 ?) D9 w4 T0 d/ F6 h7 E4 g/ o - begin
/ f+ V7 Y0 w% p8 N! G - if endpointVolume = nil then Exit;: R3 b- k! g7 N' D5 L9 {
- VolumeLevel := 0.50;
4 K p8 A7 D; s4 L9 i - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
0 e! _) o+ w. i9 x) Z% F1 t5 u$ N - Caption := Format('%1.8f', [VolumeLevel]); p1 F. B2 a* [1 u! |0 ]% [6 w
- end;
' p( t$ P: k0 c5 _
, w9 `* K& |% |1 i' |- /////////////////////////////////////' H6 p$ K0 c7 u* j
- * N& l( ?* G6 x2 }$ U
- // with best regards ToxicDream
+ ?& ^- N6 o3 |/ ~
复制代码 |
|