2010-12-21 11 views
5

विंडोज एक्सपी में, डेल्फी के साथ, मास्टर वॉल्यूम कैसे प्राप्त करें?विंडोज एक्सपी में मास्टर वॉल्यूम कैसे प्राप्त करें?

मुझे पता है कि मैं keybd_event(VK_VOLUME_UP, 1, 0, 0); और keybd_event(VK_VOLUME_DOWN, 1, 0, 0); के साथ कुंजी स्ट्रोक भेजने और नीचे सेट कर सकता हूं, लेकिन मुझे नहीं पता कि वॉल्यूम का वास्तविक मूल्य कैसे प्राप्त करें।

+0

इस प्रश्न में डेल्फी के साथ विशेष रूप से कुछ भी नहीं है, लेकिन केवल विंडोज एपीआई है। यह लिंक मदद कर सकता है: http://blogs.msdn.com/b/alejacma/archive/2010/01/13/how-to-set-sound-volume-programmatically.aspx –

+0

मैं यह नहीं कह रहा हूं कि इसे करना है डेल्फी के साथ रहें, लेकिन मैं जानना चाहता हूं कि _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – eKek0

+0

वह लिंक तरंग मात्रा के साथ सौदा करता है, न कि मास्टर वॉल्यूम। – eKek0

उत्तर

3

नीचे दिए गए उदाहरण कोड पर थोड़ा बदलाव है here (श्रेय थॉमस स्टुटज़ है)। उदाहरण में माइक्रोफोन वॉल्यूम सेट है। मैंने बस माइक्रोफोन स्रोत के बजाय घटक प्रकार - स्पीकर गंतव्य को संशोधित किया, और mixerSetControlDetails को mixerGetControlDetails के साथ बदल दिया, और सेटर को निश्चित रूप से गेटटर में बदल दिया। मैंने यहां परीक्षण की गई कुछ प्रणालियों पर (XPSp3, XPSp2, W2K, 98), ऐसा लगता है कि यह काम करता है। फ़ंक्शन की वापसी पहले (डिफ़ॉल्ट) मिक्सर से स्पीकर है - 0-65535 का मान, बटन हैंडलर में 'शोमेसेज' इसे प्रतिशत में बदल देता है। लेकिन मुझे इसके बारे में अधिक जानकारी न पूछें, मुझे वास्तव में मिक्सर एपीआई के साथ कोई अनुभव नहीं है। इसके बजाय here f.i देखें, हालांकि लेख वास्तव में मेरे लिए व्यापक प्रतीत होता है।

function GetSpeakerVolume(var bValue: Word): Boolean; 
var       {0..65535} 
    hMix: HMIXER; 
    mxlc: MIXERLINECONTROLS; 
    mxcd: TMIXERCONTROLDETAILS; 
    vol: TMIXERCONTROLDETAILS_UNSIGNED; 
    mxc: MIXERCONTROL; 
    mxl: TMixerLine; 
    intRet: Integer; 
    nMixerDevs: Integer; 
begin 
    Result := False; 

    // Check if Mixer is available 
    nMixerDevs := mixerGetNumDevs(); 
    if (nMixerDevs < 1) then 
    Exit; 

    // open the mixer 
    intRet := mixerOpen(@hMix, 0, 0, 0, 0); 
    if intRet = MMSYSERR_NOERROR then 
    begin 
    mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; 
    mxl.cbStruct := SizeOf(mxl); 

    // get line info 
    intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); 

    if intRet = MMSYSERR_NOERROR then 
    begin 
     ZeroMemory(@mxlc, SizeOf(mxlc)); 
     mxlc.cbStruct := SizeOf(mxlc); 
     mxlc.dwLineID := mxl.dwLineID; 
     mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME; 
     mxlc.cControls := 1; 
     mxlc.cbmxctrl := SizeOf(mxc); 

     mxlc.pamxctrl := @mxc; 
     intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); 

     if intRet = MMSYSERR_NOERROR then 
     begin 
     ZeroMemory(@mxcd, SizeOf(mxcd)); 
     mxcd.dwControlID := mxc.dwControlID; 
     mxcd.cbStruct := SizeOf(mxcd); 
     mxcd.cMultipleItems := 0; 
     mxcd.cbDetails := SizeOf(vol); 
     mxcd.paDetails := @vol; 
     mxcd.cChannels := 1; 

     intRet := mixerGetControlDetails(hMix, @mxcd, MIXER_GETCONTROLDETAILSF_VALUE); 
     if intRet <> MMSYSERR_NOERROR then 
      ShowMessage('GetControlDetails Error') 
     else begin 
      bValue := vol.dwValue; 
      Result := True; 
     end; 
     end 
     else 
     ShowMessage('GetLineInfo Error'); 
    end; 
    intRet := mixerClose(hMix); 
    end; 
end; 


procedure TForm1.Button1Click(Sender: TObject); 
var 
    Vol: Word; 
begin 
    if GetSpeakerVolume(Vol) then 
    ShowMessage(IntToStr(Round(Vol * 100/65535))); 
end; 
+0

मुझे हमेशा मूल्य 0 मिलता है। मैं विंडोज 7 – opc0de

+4

@ opc0de का उपयोग करता हूं - प्रश्न के शीर्षक को देखें, eKek0 ने विशेष रूप से कोड के लिए पूछा जो ** XP ** के लिए काम करता है। यदि आप उनके उत्तर में टिप्पणियां पढ़ते हैं तो आप देखेंगे कि वह Vista के साथ जानता है और चीजें अलग हैं। –

संबंधित मुद्दे