2011-07-15 7 views
5

मैं एक कंसोल प्रोग्राम लिख रहा हूं जो कुछ ऑडियो डेटा प्रस्तुत करने के लिए डायरेक्टसाउंड एपीआई का उपयोग करता है। DirectSound Programming Guide (from Microsoft) का पालन करते समय मैंने एक उत्सुक समस्या पर ठोकर खाई। documentation के अनुसार:एक कंसोल प्रोग्राम में DirectSound SetCooperativeLevel को HWND कैसे प्रदान करें?

एक युक्ति वस्तु बनाने के बाद, आप IDirectSound8::SetCooperativeLevel विधि का उपयोग कर डिवाइस के लिए सहकारी स्तर सेट करना होगा। जब तक आप ऐसा नहीं करते, तब तक कोई आवाज नहीं सुनाई जाएगी।

समस्या यह है कि मैं एक कंसोल प्रोग्राम लिख रहा हूं, और SetCooperativeLevel को पहले तर्क के रूप में एक HWND की आवश्यकता है। मेरे पास कंसोल प्रोग्राम में निपटने के लिए कोई एचडब्ल्यूएनडी नहीं है। मैंने एक शून्य सूचक प्रदान करने की कोशिश की लेकिन यह DSERR_INVALIDPARAM त्रुटि कोड के साथ विफल रहा।

कंसोल प्रोग्राम में IDirectSound8::SetCooperativeLevel पर एचडब्ल्यूएनडी मूल्य क्या प्रदान किया जाना चाहिए? कार्यक्रम का ऑडियो हिस्सा एक साझा पुस्तकालय के रूप में बनाया जाने की योजना है, इसलिए इसे "बाहरी" कार्यक्रम का कोई ज्ञान नहीं है।

किसी भी सलाह के लिए धन्यवाद!

नोट: मुझे पता है कि एसडीएल, ओपनएएल, एसएफएमएल (ओपनएएल पर आधारित) जैसे ऑडियो को प्रस्तुत करने के लिए कुछ बेहतर समाधान है, लेकिन मेरे वर्तमान प्रोजेक्ट डायरेक्टसाउंड के लिए लागू किया गया है।


संपादित: मैं एक माइक्रोसॉफ्ट इंजीनियर है कि जब GLOBAL_FOCUS बफ़र्स बनाने SetCooperativeLevel के लिए एक HWND के रूप में डेस्कटॉप खिड़की या कंसोल विंडो का उपयोग कर के बारे में संदेह को हटा से एक message पाया।

उत्तर

2

हालांकि मैंने इसे स्वयं परीक्षण नहीं किया है, तो आपको कुछ छिपी हुई खिड़की बनाने और 0Wविधि में अपने एचडब्ल्यूएनडी को पार करने में कुछ सफलता हो सकती है। SetCooperativeLevel इस एचवीएनडी का उपयोग यह निर्धारित करने के लिए करता है कि आपके एप्लिकेशन में इनपुट फ़ोकस कब होता है; इसलिए, यदि आप एक सहकारी स्तर का चयन करते हैं जहां इनपुट फोकस कोई फर्क नहीं पड़ता है (उदाहरण के लिए, DSSCL_NORMAL), एक छिपी हुई विंडो (जो इनपुट फोकस कभी नहीं प्राप्त करेगी) ठीक होना चाहिए।

+0

जैसा कि आपने कहा था, इनपुट फ़ोकस ऑडियो को प्रस्तुत करते समय हस्तक्षेप नहीं करना चाहिए। मैंने निर्दोष रूप से 'GetDesktopWindow()' को 'SetCooperativeLevel'' द्वारा लौटाए गए HWND को प्रदान करने का परीक्षण किया, और ऐसा लगता है कि यह काम करता है। हालांकि, मुझे नहीं पता कि छुपा खिड़की हैंडल का उपयोग करने की तुलना में इसमें कोई कमी है ... – overcoder

+0

एक एचडब्ल्यूएनडी पास करना जिसे आप नियंत्रित नहीं करते हैं, एक बहुत बुरा विचार लगता है। यह उन चीजों में से एक है जो संभवतः ठीक काम करेंगे - जब तक आपका कोड दैनिक wtf या "पुरानी नई चीज़" पर विच्छेदन नहीं हो जाता है। – snemarch

+0

@overcoder, मैं इस बारे में चिंतित हूं कि क्या होता है यदि कोई अन्य प्रोग्राम एक ही काम करने का फैसला करता है ... – bdonlan

2

आप इस ::GetDesktopWindow() का उपयोग कर सकते हैं।

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