|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec058' P% u4 m3 {1 y* Z, ]: q# T
By Mukta & ToxicDream
- |$ l; I5 h( [3 l- //for delphi 5
5 D [, I( ~; h0 H) U/ X - unit MMDevApi_tlb;- X- H# a4 L" V2 _( K) Q6 @2 ^. e* I
- 7 E p. s$ Z" s+ V/ V
- interface' a- S+ B2 p+ r
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
' ?& G9 x6 z i8 X: _ - const4 X3 F" L! t7 ~
- // TypeLibrary Major and minor versions
% X- g! u+ {. L( Q3 q - 4 y( O* d3 D3 [# z
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';/ Z% Q% ^; X; c. K; a' K1 u1 Z9 Y' ^
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
; [% o9 Z9 l( I% N9 E% v - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
/ s' U" ~/ k6 | Z5 M - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
8 b+ \% E# ^# Y - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
1 b3 \$ W3 g7 ]$ f7 x - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';- B2 \$ y# g( e7 b$ v- n9 s
- IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';1 V4 B. D8 Q3 E2 @$ q+ \$ P1 S
- 3 K' u2 k( X) \& C1 l. D/ S" t3 g
- DEVICE_STATE_ACTIVE = $00000001;8 E, Q v" J3 V) h
- DEVICE_STATE_UNPLUGGED = $00000002;; r+ M( t0 z9 F# `
- DEVICE_STATE_NOTPRESENT = $00000004; P" Y- p1 F4 u) U9 V; x, p
- DEVICE_STATEMASK_ALL = $00000007;. f/ D& M3 U+ O
+ L/ f2 U) r4 _1 v- type; C; I+ m9 L9 p* l' O
- EDataFlow = TOleEnum;2 a8 z x% y2 e/ B8 Y0 P8 A' ~
- const
* y5 |& z- W. Y - eRender = $00000000;$ ~1 P) x! C2 i% i4 n% X
- eCapture = $00000001;- u; F5 G4 e9 P ]% a1 u& x3 J
- eAll = $00000002;
' G0 b1 I& t( i1 Q. T' g - EDataFlow_enum_count = $00000003;# S, a4 r( x" C2 p7 y
- $ Y, W4 E, h# }6 O5 l. k2 {: M9 c
- type
w' Q* y- `8 [ - ERole = TOleEnum; t- i. ?2 D2 i
- const& p r: Z; z2 s: N: o3 _# E
- eConsole = $00000000;
( P" _1 t0 i9 M7 E - eMultimedia = $00000001;
T [9 v( P6 _# v3 e4 u) q/ { - eCommunications = $00000002;
6 J7 e5 ?. d7 N% e - ERole_enum_count = $00000003;
6 b* w% l4 a, S! S4 Z q) A, S
8 [9 a7 E. O( s' l5 b- type
4 U4 e$ f% D' O - IAudioEndpointVolumeCallback = interface(IUnknown)+ Q: ^& @; ?; @; e; ^
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
% P d+ n( M( U) U1 h" ^. P% F - end;
3 s! M: t# e; U7 O, F: o - : x; {7 K$ S+ C) s; H/ P7 u
- IMMAudioEndpointVolume = interface(IUnknown)
2 J& g W8 e! ~+ X/ h+ o - ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
# `. N# g4 X" L - Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;7 D, {2 l% d h- k9 @
- Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;& H( ]+ q! J) {: Z: i6 E# I* z
- Function GetChannelCount(out PInteger): Integer; stdcall;
) S7 `9 m; Q3 P9 \ - Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;" z( M( e; t0 N2 c6 o( `: E( N
- Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;, d1 S& J9 }6 t; B8 C r2 b- @
- Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;2 f% k! z! p% p! f# F4 E5 o: F' k; R
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
7 H6 V; X( l, L3 h% ? - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;* r" ^& L) |# G0 _# T, M) m
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
P. Y5 k' R* Z! A, x9 I( }( f. J - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;8 ~9 @+ s) @, p- n& V5 C4 s
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
2 v% ?/ h) ~* N - Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;9 F) g9 N& r- l( s
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;
& M$ U' E3 N4 Q9 M0 k# @# ~1 Y - Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;/ ~- I$ E: N# t, u$ b
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;2 _! [' \ Y" z, g2 Q- K
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
9 { \9 |% L$ X - Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;# o' c2 L& Z& A- M! ^. e
- Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;6 z* U: z6 y! n1 `
- end;- ^2 ?8 `! n( u; a1 g% `
- 6 e5 }- ]& ?* f6 i U) G; E3 v
- { IAudioMeterInformation = interface(IUnknown)
+ T- P8 Q% P' K8 L& B' c" v" P - ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']. P6 ?6 ^. D, h8 }" I
- end;}
/ [2 U1 G# G+ Q: `; s* B - 3 F; k5 p/ C$ |) O8 h
- IPropertyStore = interface(IUnknown)8 r+ }# O9 q+ [; R% X* o
- end;
1 L, {3 n" B( r- }+ k - 6 A6 h- l, D; A5 ?3 l
- type2 Q# J k! y' i. n9 v9 \
- IMMDevice = interface(IUnknown)+ r8 a! ^' }9 Y% J
- ['{D666063F-1587-4E43-81F1-B948E807363F}']
( @) Y: I2 O! a5 v5 d* r - Function Activate( refId :TGUID; F" D# [& U- p+ n$ C' l9 L ], b
- dwClsCtx: DWORD;
: Y" x# D2 R! }$ R$ h% _ - pActivationParams: PInteger ;1 [8 ]8 r* o: f9 L9 H0 U
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
+ Q4 l2 ]* ]: L+ Y% Q% }& { ~ - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
+ E$ g L1 i, W - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
0 U, Q% Y- Z0 c7 A1 H; g d" C! i - Function GetState(out State :Integer): Hresult; stdcall;) Z+ o, L& I, _3 r6 e% d
9 H, o( g4 f A) x. M- end;, w: R S( P5 s
' P& P3 x; L6 Q1 _2 N1 S* m; q8 ~- ! O7 [# D3 k8 Y
- IMMDeviceCollection = interface(IUnknown)
7 H3 T$ v3 ~- d - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
: _$ Z& R! I* ?1 u - end; F7 ?! C) J) Z
1 e) l9 ~8 x5 B5 Q$ A- IMMNotificationClient = interface (IUnknown)
7 K3 E% _0 [- X+ P! E: ] - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']$ `2 {- c) P, g! }+ ?, ?
- end;
% P0 K" v0 |! h. r - ; P( N6 o1 K) n. U5 b4 u
- IMMDeviceEnumerator = interface(IUnknown)
$ b$ ]: }5 d" t+ f( P$ ~ - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
: V6 ]8 E% D2 o1 m0 r U4 C% e - Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;
1 ^4 e. l; O+ f5 K7 C8 _ - Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;
, e- @4 {* n1 R - Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;0 t3 a' J" n( d5 Z
- Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;+ r. H! i4 p7 N8 D3 ]3 `
- end;
0 K X" ]4 ?/ G7 u9 C( N5 Q4 w3 q
; q- o$ y5 M. W2 D7 l- implementation. K! a, |, t% n; h5 R6 D o* B: K" h
- end.) S, A" g; u; o& y% K/ w' r9 K& v
5 [- ~# {4 n! K, _# J- Thanks & Reagrds,
) C9 f0 u+ L1 v7 D' d - Mukta ...0 z" ~* {& P0 z# O
复制代码
5 |: m, G/ w$ I& j% U+ B0 i- it's work in Delphi 7$ |/ e- b k& ^
- //////////////////////////
% A, ~# \: [' X1 D3 b2 Q" k
! V! y4 O2 S; Q: B" J3 A y- unit MMDevApi;- Q3 B) F9 ]% h& y$ p4 [) z% t A' s
9 |# b9 [9 b4 m% x; s5 f2 R0 ]- interface
! I8 s0 c2 d5 D1 S
. |- `# V9 x3 v, p- uses7 p2 L& r/ \. R8 G' L
- Windows, ActiveX, ComObj;1 B) B% H# ?4 N# \9 F v1 E' i
f; m5 H8 O$ n1 X- const$ u$ ^) a- B% R
- CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
, T: ]/ D$ D7 n- f+ t - IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';/ ], C, k- o$ r
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';7 u5 h2 `1 w) j! r7 _
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
0 J" Q5 _; `' B @9 k5 Y - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
4 Q- R3 P2 u& x6 w6 K) \ - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
& ~+ S) K7 {) a3 }1 G - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
7 W! H5 P; V7 {7 E- v& I# I g
6 G4 R5 O% j& j- DEVICE_STATE_ACTIVE = $00000001;$ ?' i; _- `8 ^: j: h8 U
- DEVICE_STATE_UNPLUGGED = $00000002;
! f% ]) t( P j' ^ - DEVICE_STATE_NOTPRESENT = $00000004;
/ t# B2 a3 v |3 C - DEVICE_STATEMASK_ALL = $00000007;. n- ]3 Z" j, p9 _
3 r( h, u( j; F) {- type
, X6 E- b. F$ Q2 l - EDataFlow = TOleEnum;
8 [ l* a5 o" A, X
- E7 C7 J2 _; B8 D- const
+ [6 X9 A& _) k% E9 d& ~, H; j4 F a - eRender = $00000000;
2 X- l, z' @/ g( { - eCapture = $00000001;
0 ~8 {+ \8 r" u- [* A2 o1 e2 O - eAll = $00000002;
" a: R$ I" t) ~6 _: m% k! c3 H* r6 B - EDataFlow_enum_count = $00000003;
) a5 Z# J/ I# ]1 R - - m+ M* u$ Q% ]
- type
1 N9 W* i$ w! S2 H1 J+ N - ERole = TOleEnum;
0 h9 n' @/ O z$ A - . K& u, Y/ v ?/ e2 V" p
- const
* J8 B5 c6 \ |- P9 L- t; W - eConsole = $00000000;# j+ I# s7 Y8 N% {7 D
- eMultimedia = $00000001;( S" `! o* ?+ {+ r$ h) W
- eCommunications = $00000002;
" o9 `. i; e0 r4 h# Q" ^ - ERole_enum_count = $00000003;5 W* k6 `0 b: H2 p0 K0 K% O
- t1 F) }% v* E8 m- type. y3 m5 v. Q4 ?( p( o
- IAudioEndpointVolumeCallback = interface(IUnknown)1 W) l5 @" A( V" S
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
. J' M7 D+ x6 @% Q - end;, O; q4 O& w' @) w2 w- N7 a# }3 Z
- - m7 V k z1 a# K
- IAudioEndpointVolume = interface(IUnknown)) q* M# c% c" L/ n1 I
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']( r' E+ G$ Y4 p/ [9 V. Y
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
; H- \7 @* I* o. q8 @5 ` - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;# G5 E3 Z+ ]+ q6 f; M6 Y9 N3 T
- function GetChannelCount(out PInteger): Integer; stdcall;+ r' n+ k3 u7 D3 ~. A7 V
- function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
0 W# A0 r+ ]/ \2 `! z" H& M - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
- y4 l4 ]* K9 t7 `# _ - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
! y; J& o5 g m: s' t! M- b) a - function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
* ^. M* E- f% J2 q" N' p$ H - function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;; R9 ^/ A% S" m4 ^
- function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;, H1 l* R& S2 T$ n$ o
- function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
6 P1 |4 y* C) N" l$ r - function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
2 _8 B# R" s$ e1 _" ^1 f - function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;" T% H3 }! B) Z( Q
- function GetMute(out bMute: Boolean): Integer; stdcall;3 S- F( f1 k# U% a5 y# ~8 Y# u
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;; G( W; z* d K8 H" O
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;% V, F" l/ }9 Z
- function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
2 _' E5 y' H r0 R - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;5 B3 }& ~8 ~) V! n
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;% p& t/ p* _2 B4 D: t, l7 k
- end;+ j. [/ q1 o1 v/ L+ V
- ; x! {$ A% S8 n* ?+ ^0 b
- IAudioMeterInformation = interface(IUnknown)6 [# T8 J: m% g; Z
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']) G- E$ s: F+ L7 | J( M& z* s
- end;
# [% B7 E0 D1 x6 M# ?
" t4 C- {, h$ I: x" m- IPropertyStore = interface(IUnknown)8 m' X+ n) c' E1 b1 U t$ ?
- end;" Y6 V$ `+ X6 u3 _
5 j5 T" Y4 K& ~2 s- IMMDevice = interface(IUnknown)
% }! L8 R4 W; y: A4 K- k/ j- Z( { - ['{D666063F-1587-4E43-81F1-B948E807363F}']
( X) {4 K. q. g m$ f9 b1 Y I - function Activate(const refId: TGUID;
9 x* ?/ r& z* D5 ` - dwClsCtx: DWORD;: R7 a& i* e8 b4 D% H, |
- pActivationParams: PInteger;
0 r# t$ `) L3 o+ n - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
2 \9 O- a. o2 Q/ s( c& E( h - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;# r2 f; K. J" `! F
- function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
$ ]- v6 n1 O* U1 I1 z+ M7 J - function GetState(out State: Integer): Hresult; stdcall;/ @4 {, Y1 B) u& s; P$ x3 b" }' |7 P
- end;2 g! @4 \' u- r: l' n
: P% { o& G6 ?* J- 6 Q4 Z+ o; J# Y4 M0 d) Y. k
- IMMDeviceCollection = interface(IUnknown) H5 h0 J8 J& m" j7 o
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
! \! E4 F7 h* D4 V4 r# w5 j - end;
7 S9 N C h# J* Z! g! L
W0 K1 g; B) T8 {2 E; B/ S- IMMNotificationClient = interface(IUnknown)
1 `" e) g- r( z' W* f; D - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']/ z; m: y% z G% x' g' ]5 {; M
- end;
/ Z: J! A4 A. A4 E# X - 1 h+ n( U7 p7 C- ?2 u
- IMMDeviceEnumerator = interface(IUnknown)
4 P" ^9 ~8 L2 ^# H - ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']8 K9 Y) {' b# I0 y* y
- function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
2 P- l$ A- N7 ^ - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
x* Q" S/ z W/ t - function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;9 j5 _# z2 }1 r
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;, l ?# E9 t0 {
- end;
6 Y: z% y. E) o% {9 d T7 y& Z - ( s# y6 y, ^. k! D# Z* E8 j
- implementation3 x, j% h3 O" j3 g; `
. S* m8 S+ p2 ~; Q6 j4 ]- end.
3 G. y2 J- r5 W0 v9 g; K
, J0 h O3 h& D& E9 D1 r7 o) E. f) h- ///////////////////////* A% H' T; o) K& i
- simple sample :)
$ ?" B1 h4 W+ u9 k, c5 z" G% X - ///////////////////////( \6 _2 K) @" g# W t: U$ |6 I
- ( `- o p3 J. n: l3 c. s$ t3 M& F
- //...... other code* p" j9 t. [ U/ e5 N6 a; b
- 9 S/ c2 w: w% Z
- uses ... ActiveX, MMDevApi, ...;
) ~4 n( v& ~9 i" f- b3 R
& J: I0 ~' {( ?* l2 B( C- //...... other code
& s" i9 N$ ~ s- Q& a- \ - ( Z- m: Q9 H% d! M1 g. y) o" [
- var
$ T! w; r5 i+ K! _4 d - endpointVolume: IAudioEndpointVolume = nil;2 r* n+ U7 I, i
( i. j6 v% T) X* Q# @- procedure TForm1.FormCreate(Sender: TObject);
" n# |1 `# ^+ F - var
9 L9 I& S1 T8 n8 E* l - deviceEnumerator: IMMDeviceEnumerator;
3 p; H# `9 G- u9 B" ` V - defaultDevice: IMMDevice;
. E3 P- i- W8 j# v - begin
6 ?! L( h8 Y0 D; l3 Q6 V& M - CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
( J+ G' c; n6 @2 F" i j5 f/ M - deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
) o+ U m5 K0 }$ w$ R' p0 U - defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);% y: k+ a8 U! ~5 z8 G% S$ j! x2 @ v
- end;; A5 h* |! J) z# m
- 9 I- r9 B5 M' t: f( y
- procedure TForm1.Button1Click(Sender: TObject);1 R. F) v( i2 q4 N0 U% [, O
- var
/ h. q4 ], h/ Q0 p - VolumeLevel: Single;5 t/ ~3 M( Q, B! P3 G; F& o
- begin7 {- V- V7 c9 Q
- if endpointVolume = nil then Exit;
L2 j( O7 g' F0 R# J - VolumeLevel := 0.50;
% u1 T7 @3 P* H E2 |& z - endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
) U! |8 O- U ]; ]' _: f - Caption := Format('%1.8f', [VolumeLevel])
* l" d- \' D7 t) i - end;
6 [* d/ v0 u1 m$ e* h; q$ q; k
) j: b' M# u- N7 M. u' @4 w- /////////////////////////////////////5 Y2 S' S8 _7 g" z4 @: _
& Z3 @( T9 z. j! _- E6 U* p5 M- // with best regards ToxicDream$ R4 Z j& V3 B" O4 m7 U, W& N, U
复制代码 |
|