|
|
来自: http://social.msdn.microsoft.com ... 9-a8c9-2e27eb9ec0588 M+ O. |0 `7 \& L
By Mukta & ToxicDream- ! G1 l( |$ q1 W4 U0 m
- //for delphi 5' O: _% h1 [+ p7 R' ]" {
- unit MMDevApi_tlb;
2 O |( Z# M; | - / M s' |9 m+ Q5 ]9 n4 x
- interface, j1 k& F0 r; f% a% _
- uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
% [1 {; `' |4 H+ i+ I - const$ ^ y, U( S+ n ^: J/ h
- // TypeLibrary Major and minor versions* @' n- d/ m9 ]! v7 y* e# z, V
- ' {" g1 F; f# F+ i! u3 A% K
- CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';" t! q+ {5 A x7 o/ c; W
- IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
! J- D ^4 U) Q3 d - IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
0 {- l" h& q6 T# _7 A - IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
% s. [2 Y3 w6 w; x) n - IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
/ A( B# O5 i& H/ R/ D" M1 P' L - IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
+ t# M4 H$ H0 U, H - IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';, R7 Y4 N9 |5 V: O
7 ?1 M7 m1 G, Y& x# b- DEVICE_STATE_ACTIVE = $00000001;# m! _! C, J3 H* N% p
- DEVICE_STATE_UNPLUGGED = $00000002;
3 M. C' i- p- `2 n+ U - DEVICE_STATE_NOTPRESENT = $00000004;
* _) J/ J- Z7 B; H - DEVICE_STATEMASK_ALL = $00000007;
0 j. k7 q. o0 y5 ^; p
0 C) n# ~' O) J% N* S% j; |% t/ s" R- type( Z5 E0 \' w0 k, C1 A
- EDataFlow = TOleEnum;" X ~- p# K9 [
- const) U$ ^- ^. G; k5 V; L
- eRender = $00000000;& O( j3 V$ W; G
- eCapture = $00000001;& l! P& _# t3 X, e7 J# x
- eAll = $00000002;
9 }- Q/ v- p& S0 D0 L8 y) | - EDataFlow_enum_count = $00000003;
& \* U! z: X" C: `
& f& V* m4 L8 R: x9 S- r' y1 j- type y# s) Z) f4 [& L& b: c; \
- ERole = TOleEnum;
7 _! v6 y' H6 E; Q& T - const
7 N' _8 v. _7 V6 J& j - eConsole = $00000000;
' l! L y7 A( } x - eMultimedia = $00000001;
0 J! X0 F6 b% D - eCommunications = $00000002;" k; y6 y; Y" d2 B- `" R( }" C: ?
- ERole_enum_count = $00000003;- j$ p- A1 u' Q) R
- / R) {/ I" P7 e$ X7 t' X2 ]( Y
- type, u9 y$ ^+ _% Z5 h( q# S6 w- G
- IAudioEndpointVolumeCallback = interface(IUnknown)& [0 C" ^9 i) [# ?- \" P
- ['{657804FA-D6AD-4496-8A60-352752AF4F89}']; J* l/ a* f! S V- \, g! r
- end;
$ Q+ `$ l: Q2 M& |8 V) L
2 {$ a( f! g% F- W4 Q4 T f- IMMAudioEndpointVolume = interface(IUnknown)* r, m3 f S, U0 @
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']) r4 L1 F& [; a+ ?# t4 U+ N
- Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
& f# U' i& ~5 M. ?( ], j! V, l/ @9 h - Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
. A& H6 T& Y2 b2 x - Function GetChannelCount(out PInteger): Integer; stdcall;" L. K, i$ d: ^; I9 T6 q0 K
- Function SetMasterVolumeLevel(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
/ I8 y9 Q4 M- }# t( W8 c# N - Function SetMasterVolumeLevelScalar(fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
+ s9 K4 U6 }/ W0 } - Function GetMasterVolumeLevel(out fLevelDB: double):Integer; stdcall;% t D* M# f: T& ]
- Function GetMasterVolumeLevelScaler(out fLevel: double):Integer; stdcall;
5 O& `" e: l: z3 z! D: W' ? - Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;$ C0 A# e# L- g
- Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
; d: {; b* d+ T9 E9 Y - Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;+ f+ |* L2 w* P
- Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;5 y h, o7 g9 T- `5 ]9 l: M4 K- D
- Function SetMute(bMute: Boolean ; pguidEventContext: TGUID) :Integer; stdcall;6 z3 Z; ]& p! Y; w2 a0 \
- Function GetMute(out bMute: Boolean ) :Integer; stdcall;3 R) a2 Y, ?' D: [5 k; V2 z
- Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;9 j! S9 q. p/ [: O: u4 l9 ]1 g
- Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;5 |4 J$ G3 T1 I7 M) i2 X+ N7 M# s
- Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;# E0 [1 f3 h6 a# d
- Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
/ [( _, t7 i K8 ^. e) O - Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;) z% p( N2 N8 O1 S
- end;9 ?$ C4 M+ T1 v3 ?: D
$ f8 a. K }; u" b& H1 V& N; `2 y- { IAudioMeterInformation = interface(IUnknown)1 o k! c' d7 T! c9 i" F
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064']
6 @+ K4 \+ s1 e7 ?4 N - end;} m; r( s3 d2 {' [. P! o
- 5 g7 H8 Q! H$ e( _5 j7 t2 P( ?
- IPropertyStore = interface(IUnknown)
, W% ^2 O8 g9 t- X; r* W4 K - end;8 ^, K! F* d3 b" U8 b, C& [
- , Z+ g5 S* Y* h/ N1 ~+ z/ S9 |
- type
/ J. e) v& k! N$ | - IMMDevice = interface(IUnknown)# a& V" g& U" G
- ['{D666063F-1587-4E43-81F1-B948E807363F}']5 g$ `4 P- T. L2 ~0 b
- Function Activate( refId :TGUID;
% ]9 G9 C7 N* p" K9 |5 V/ t - dwClsCtx: DWORD;; [- R5 `) E- W9 x. `1 G
- pActivationParams: PInteger ;/ R8 y, p C3 h$ h* C
- out pEndpointVolume: IMMAudioEndpointVolume): Hresult; stdCall;
1 b _9 l; e! ^ - Function OpenPropertyStore(stgmAccess: DWORD; out ppProperties :IPropertyStore): Hresult; stdcall;
, b: d! \3 s- B. u& ^5 r, P- c - Function GetId(out ppstrId: PLPWSTR ): Hresult; stdcall;
3 V/ t) A% N4 a7 ~- F. W - Function GetState(out State :Integer): Hresult; stdcall;
+ v2 D% H8 e% U( q. u' k
; e: F7 o5 y5 ^+ Z3 ^- end;( L" @8 s: c; p% a' ?& a
- 2 {. I2 |1 e! A5 F! M. Y) R0 `
W5 V3 F( D1 g/ [- IMMDeviceCollection = interface(IUnknown)* j& j% ` }7 v! V. \
- ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
X5 w1 ^ R$ p8 Y8 v8 e" G/ a# I, ~ - end;3 E: m* ?. h- ^& m5 r
- I# ]2 A- K& `
- IMMNotificationClient = interface (IUnknown)" V6 x5 A% Q6 S% u0 x, l
- ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']: r* g+ d, F- {9 M1 u. e* p
- end;5 v' P8 T7 e$ n; g! W
- 0 D* z+ `, b0 s4 {$ g3 h. m
- IMMDeviceEnumerator = interface(IUnknown)5 y9 {# f8 Z: g
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}'], P; K N- _6 a; n5 a2 O
- Function EnumAudioEndpoints( dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection:IMMDeviceCollection ): Hresult ; stdcall;* ? r' w! x6 j5 z9 N) g3 H
- Function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult ; stdcall;2 N9 C. ?7 c. ]& R
- Function GetDevice( pwstrId: pointer ; out Dev :IMMDevice) : HResult; stdcall;
6 j: W* ~* L6 I; | - Function RegisterEndpointNotificationCallback(pClient :IMMNotificationClient) :Hresult; stdcall;
( V" N4 {) l1 h - end;
- A. {# |1 A! T s) l) B4 } - 2 H9 l* _1 c \4 r
- implementation. \; x0 `# x7 j+ U* A. F+ y3 }
- end.2 [9 w6 w" s- X9 e$ P" e* p) x
- ! M" F* E/ ]& P' x) O8 P! o
- Thanks & Reagrds,
0 [. T" ?# C, G. A h7 Q - Mukta .../ r' C" q2 o' o! u
复制代码- # o+ H; m3 r, E0 d' J, P
- it's work in Delphi 7
) g) ~' d- J8 s- G- i - //////////////////////////
+ \ ^/ e+ s9 \7 L X - {( B1 H( N. t$ c& Z m
- unit MMDevApi;0 O# Y; y7 f0 e1 U
- 4 a- y0 V- U3 \) C; h% v1 Q& |
- interface
1 x3 o4 D2 n( H4 S' E+ ]
6 n0 C$ K( V. h; @8 V- uses
* F7 r- ]' S! z+ I i# v8 Z2 I - Windows, ActiveX, ComObj;
, r4 N9 p& Z( N- w% ~# P
; C1 i0 @$ H2 N- const
! m* D" w* y4 C8 t - CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';* u6 S% c; j# B
- IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}'; W( y* z+ ]3 x' a3 y
- IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';$ _3 ~4 E' D; L' |' ^/ y
- IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
! z7 v7 F. v; D( f; l - IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';+ D) y, w. s+ b* E
- IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
6 [+ |; p+ Z4 W* Q - IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
& s5 P! i7 ?$ [+ {; @1 Q5 T0 O
2 [8 R9 {$ x! m$ @( g- DEVICE_STATE_ACTIVE = $00000001;5 H; h8 t& ~' C; C% T' ]
- DEVICE_STATE_UNPLUGGED = $00000002;" z( {% ^ t! k0 ]7 ]" W
- DEVICE_STATE_NOTPRESENT = $00000004;
! Q3 q0 B0 e: x8 w8 M! t4 e - DEVICE_STATEMASK_ALL = $00000007;
( x& g1 E9 A" \, s2 Q7 U2 j
9 S. u3 Z1 ?1 `- type& ]0 h- _; E/ j, N7 e: C
- EDataFlow = TOleEnum;( t% [! z* M5 S- { h$ \8 q0 l F
3 ]3 `; |' H. _* H8 T' I- const
. C+ D, `' z3 k" d - eRender = $00000000;
! q& N6 n# A6 ^( `1 n5 I4 l4 s' Y! W - eCapture = $00000001;
L- I- x( P- @1 m5 ` - eAll = $00000002;
$ d& E$ t# K3 ^2 S' y' ~8 X8 V - EDataFlow_enum_count = $00000003;! v: D5 o6 {0 e
, o9 [0 n8 F" ?/ I0 _- type
; b. H7 T. E* W1 ?: V - ERole = TOleEnum;
' s" k5 q7 X) R" U' N4 w- q
* F/ ?0 W' b2 m+ e9 V6 r- const
+ F3 a; x1 s" A - eConsole = $00000000;* K) O* B1 [/ N y$ [& a
- eMultimedia = $00000001;: u3 ]9 Y4 i- \0 z- |
- eCommunications = $00000002;0 d7 f2 |8 r- M# K1 s# {
- ERole_enum_count = $00000003;
9 z8 V' S) `# C0 y$ V& S' N) U* U - : F; i! z3 t9 s7 L) C
- type- _. o! N- ]! I: j
- IAudioEndpointVolumeCallback = interface(IUnknown)
% m3 Z# w7 Q, C1 T2 S0 e - ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
* j+ i0 R3 \5 |. c; g( p - end;
( |4 t. U+ ] {8 Y+ N+ @ - ! z7 x. F' ]1 g7 @; K: s1 H
- IAudioEndpointVolume = interface(IUnknown)" h; b7 A1 Z4 i, U/ u; }
- ['{5CDF2C82-841E-4546-9722-0CF74078229A}']7 V/ g8 r3 Z2 G& F- t
- function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
( g: _ m7 T. x5 K - function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
' O5 S; l! I8 G - function GetChannelCount(out PInteger): Integer; stdcall;
7 @5 Y& f; V7 z& M5 f - function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
" B" e, C+ ?( y; e - function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
G5 X6 k7 R# W! d - function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;: \+ V3 I I# k
- function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;# r) A) t2 u$ i4 Y% X$ \
- function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
; i& L0 u3 p4 O! d% @; b: B - function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
. _' h. F& A; R0 t& B - function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;' \/ Q' o( C) v- \# f$ p3 }; ~! T
- function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;% I# o; k4 L$ G) T; U: l4 d2 x. T* T
- function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;- [! H& `% l# R3 _/ E9 U& w
- function GetMute(out bMute: Boolean): Integer; stdcall;$ v" m4 c" A; d$ i* ]- a* S
- function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;/ e7 ^% H2 S: V8 b7 m
- function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
6 Z l$ |4 i$ V7 A7 C2 }6 o - function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
7 L+ |/ L! i- n) n - function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;/ K5 r- d; D) W6 v
- function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
5 ?* \' {/ ]5 r - end;$ \& c) S) i: g# O p6 @
" {6 V* {( m+ `% e4 d2 G* Q: ~- IAudioMeterInformation = interface(IUnknown)0 B+ _- O7 o5 `: F. c2 c/ ?& W
- ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']1 y9 `$ z, C4 H; k( S
- end;: Y# a5 [8 v' p. o# X f* R7 d4 c
2 a9 X, P; ~% o% ]0 x- IPropertyStore = interface(IUnknown)' {9 V' v- p, Q2 d0 x
- end;
# I: ~5 O. z; r - ( _# U/ Z. A0 K; ^, y* y) K# Q* _% u
- IMMDevice = interface(IUnknown)
0 {; U% ~ p# g; g3 _6 v. m3 v - ['{D666063F-1587-4E43-81F1-B948E807363F}']
# k( w" A; @" t1 _$ A: n$ k - function Activate(const refId: TGUID;& ~# A Q7 ]3 l! m" [* w
- dwClsCtx: DWORD;$ {8 I. M$ W/ r; M# X# r4 V
- pActivationParams: PInteger;
7 O1 s: T# a" t x( C* B' R - out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
+ z0 K: _" N! V' s& {1 _- R6 M - function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
7 L% \# B# H; V* L' } - function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;! y2 c# R6 P6 V1 Y0 {
- function GetState(out State: Integer): Hresult; stdcall;
- D1 e0 }; n5 B j6 l0 Z- a8 w - end;
' T* _* c- x. T0 K" b, W - ' ^+ R% S, i$ ^
9 a2 u3 E7 x; N* _) w! [- IMMDeviceCollection = interface(IUnknown)
, [! c% _' S3 W7 V& b( k" j - ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
" N0 U0 X7 x' S - end;
3 s7 e9 ^& x4 s3 F) c - d f9 N7 n. W; ?3 r1 D" e
- IMMNotificationClient = interface(IUnknown)
1 ~, w# X( P, T1 U - ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
: r9 o% m6 Q) B7 |% W0 H" @ - end;
4 r# [1 {! E; r8 \2 M% ]( }1 @# j
* {/ H' R0 d ?* w; a- IMMDeviceEnumerator = interface(IUnknown): D" m# c# H6 ]5 @) F' g
- ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
6 j5 M9 T( h0 ~ u - function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
2 P! G( h& p7 E, l" P# S - function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;! W) F6 Y/ |7 W: ~/ ]! h" x5 v5 J
- function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;$ q$ W; _, K! L9 b6 g
- function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;8 _5 x, \" |' t9 S* j1 f% F
- end;+ v, ^# Z$ s! X# G8 I* b
' o/ V. }1 x5 u& P- implementation6 ?9 `1 n4 _- }3 j
- : n$ a5 c1 }' z, c5 o: I' u
- end.
9 h/ y- Z$ z& T6 {# Q3 B6 a, A
d+ n4 B: S/ ^) y: @6 _) o- ///////////////////////
1 i1 E- i4 A2 n# Y% P) ~7 n, {' V - simple sample :)
& t* l& h2 k# x) v& Y - ///////////////////////
( h5 {- A' ?( T' b' a - + e7 k# V6 o0 A. k& u
- //...... other code
! d7 F1 x7 X3 Q: K) o% S A
( q1 W9 B3 G$ E# K# r- uses ... ActiveX, MMDevApi, ...;* i8 \$ a$ W3 \& U- @8 J
- ) v1 _: @5 h" h# A X
- //...... other code
% w$ X4 P+ Y9 S) k: v - " m% u! t+ h4 x6 v9 H4 D
- var
* y/ n; ]0 T( B1 ~6 O F5 s g - endpointVolume: IAudioEndpointVolume = nil;: h+ N9 E3 {' I4 q3 o# b! ]0 E
. q z% J( W$ e" c/ D) V) T) E- procedure TForm1.FormCreate(Sender: TObject);1 v9 ], D8 a2 a* ~
- var% x0 |" H/ @# H9 a& ~. h
- deviceEnumerator: IMMDeviceEnumerator;
% f7 g: Y& H* C) S - defaultDevice: IMMDevice;( \. Z7 i- Y* L; ~" N j
- begin* S/ r' a' n7 k1 g7 w' M
- CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);+ b2 ~( o; p+ Q
- deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);+ X1 S* b( q0 U9 Y1 t) n
- defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);% C' C& D# G% b# w
- end;
+ F- z% l5 C9 N7 F: v
; c( C- y% l7 ^6 e9 d5 {" t- procedure TForm1.Button1Click(Sender: TObject);9 n. E$ F( C- ~
- var
, n. b. _" J) c% L2 h* w3 I) I, v - VolumeLevel: Single;
8 B# D1 [6 V% s q- g - begin
% l2 C& K+ U2 @ - if endpointVolume = nil then Exit;
- t) s) d H2 D5 \. n+ j E - VolumeLevel := 0.50;0 n- Q @9 r8 v
- endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);5 ~& r. r6 B1 ^- J p
- Caption := Format('%1.8f', [VolumeLevel])
8 R$ O% q: C, F5 o - end;8 E9 K' t4 s! g' E- T. F
- * {% M9 R( S+ c8 N9 i. I& V9 r7 p
- /////////////////////////////////////) N E. o* v2 u0 R" T. x4 Z2 ^
, h1 t4 d) X' c0 [! I; d( n* g- // with best regards ToxicDream
, w- G: Z: u/ _" ^& p4 N" [7 e8 h
复制代码 |
|