2009-04-14 19 views
7

मैं वह लड़का हूं जो थोड़ी देर पहले था asking about controlling Windows Media Player via Java. मैंने प्रगति की है, लेकिन मैंने एक परेशानी की समस्या को मारा है, इसलिए मैं मदद की तलाश में हूं।विंडोज मीडिया प्लेयर मुझे अनदेखा कर रहा है

मैंने सलाह दी कि मुझे पिछली बार 'राउंड और जैकब स्थापित किया गया था। मैं एक परीक्षण स्क्रिप्ट से बाहर इन पंक्तियों को अंजाम:

ActiveXComponent wmp = new ActiveXComponent("WMPlayer.OCX"); 
wmp.invoke("openPlayer", "http://somafm.com/wma128/groovesalad.asx"); 

... और wmp पॉप अप होता है, SomaFM खेल रहा है। "W00t!" मुझे लगता है। "मुझे यह हल हो गया है!"

सिवाय इसके कि जब मैं इस ऑब्जेक्ट के निर्माण के बाद बातचीत करता हूं, तो ऐसा लगता है कि डब्लूएमपी इंस्टेंस खेलने के साथ ऐसा कुछ नहीं है। जब मैं इस कोड को निष्पादित करें:

 
VOLUME: 50 
VOLUME: 0 

यह काफी अहानिकर लगता है, कि

  1. "50" की मात्रा को छोड़कर कुछ भी नहीं है:

    ActiveXComponent wmpSettings = new 
    ActiveXComponent(wmp.getProperty("settings").toDispatch()); 
    System.out.println("VOLUME: " + wmpSettings.getProperty("volume")); 
    wmpSettings.setProperty("volume", 0); 
    System.out.println("VOLUME: " + wmpSettings.getProperty("volume")); 
    

    ... मैं का उत्पादन मिलता है जहां खिलाड़ी वॉल्यूम वास्तव में सेट है और

  2. प्लेयर की मात्रानहीं हैवास्तव में सेटप्रोपर्टी कॉल के बाद बदल जाता है।

मैंने अन्य गुणों की भी कोशिश की है, लेकिन यह वही बात है: गुणों का मूल्य खिलाड़ी वास्तव में क्या कर रहा है उससे संबंधित प्रतीत नहीं होता है, और उन्हें बदलने के दौरान राज्य को बदलना प्रतीत होता है ऑब्जेक्ट का उपयोग किया जा रहा है, इसका वास्तविक प्लेयर पर कोई प्रभाव नहीं पड़ता है। (जब भी मैं स्क्रिप्ट चलाता हूं, तो मुझे सटीक वही आउटपुट मिलता है, इसलिए जब भी मैं "वॉल्यूम" को घुमाता हूं तो मैं बदल रहा हूं, इसमें कोड के बाहर कोई दृढ़ता नहीं है।)

स्पष्ट रूप से मैं ' मैं कुछ गलत कर रहा हूं, लेकिन मैं समझने की कोशिश कर रहा हूं कि क्या अंधा कर रहा है। क्या कोई मुझे भयानक होने में कोई अंतर्दृष्टि प्रदान कर सकता है, या मुझे आगे क्या करना चाहिए?

(नोट:।। मैं भी कुछ "WMPlayer.OCX" नहीं कर रहा हूँ सही इनपुट पैरामीटर है जब तक मैं इस एक पाया मैं रजिस्ट्री में HKEY_CLASSES_ROOT में होने की संभावना दिखने प्रविष्टियों के साथ प्रयोग)

मेरे धन्यवाद किसी भी मदद के लिए अग्रिम कोई भी पेशकश कर सकते हैं।


संपादित करें, 2009/04/15: मैं एक कंपनी ईज़ी JCom बुलाया से प्रसाद में एक WMP विशेष पैकेज नहीं मिला। यह उन तरीकों से असफल रहा जो मैं देख रहा था उससे पहले या तो यह सिर्फ जैकब के लिए एक रैपर है, या डब्ल्यूएमपी एक्टिवएक्स/कॉम इंटरफ़ेस सादा टूटा हुआ है। (रुको, मैंने "या तो" क्यों कहा?)

मैंने ग्राहक सेवा से बात की, और वे यह दिखाते हुए घायल हो गए कि वास्तव में उपयोगी होने के बिना आप कैसे सहायक हो सकते हैं। उन्होंने मुझे अपने डब्लूएमपी कोड के क्रियान्वयन के उदाहरण के रूप में प्रदान किए गए गैर-संकलन नमूना कोड को सही करने में मदद की, लेकिन जब मैंने उन्हें कुछ अंतर्दृष्टि के लिए परेशान किया कि कैसे/सेट वॉल्यूम विधियों को काम करना है, तो मुझे यह मिला:

"क्षमा करें, लेकिन यहां कोई डब्ल्यूएमपी गहराई से विशेषज्ञता उपलब्ध नहीं है - ईजेड जेकॉम जावा और डब्ल्यूएमपी जैसे अन्य कार्यक्रमों के बीच सिर्फ एक पुल निर्माता है।"

उनके पैकेज का ध्यान रखें, जिसका मूल्यांकन मैं वास्तव में" wmp.WindowsMediaPlayer "कहलाता था। क्या मुझे इसे काम करने के लिए मिला, तो मुझे लाइसेंस के लिए $ 600 को खोलने के लिए अपने मालिक से बात करनी पड़ी। एक चमत्कार यदि वे वास्तव में अपने स्वयं के उत्पाद के बारे में कुछ विशेषज्ञता था कि वे क्या आरोप था

तो, कोई वास्तविक प्रगति बस सोचा था कि मैं हिस्सा था


संपादित करें, 2009/04/20:।।। हाँ, मैं अभी भी इस पर जोर दे रहा हूं। मेरा वर्तमान ऑपरेटिंग सिद्धांत यह है कि वॉल्यूम सेटिंग्स को प्राप्त करने के लिए, मुझे डब्ल्यूएमपी रिमोट तक पहुंचने की आवश्यकता होगी ly। मैंने IWMPRemoteMediaServices और IServiceProvider इंटरफेस का उल्लेख देखा है, उत्तरार्द्ध की क्वेरी सेवा विधि पूर्व के लिए एक सूचक प्रदान करते हुए। दुर्भाग्यवश, मुझे कोई भाग्य नहीं है कि IServiceProvider को कैसे पकड़ें। मैंने उल्लेख किया है कि यह विंडोज़ "सिस्टम" ऑब्जेक्ट से सुलभ है, लेकिन मैं यह नहीं समझ सकता कि उस ऑब्जेक्ट को कैसे पकड़ें। (और चूंकि "सिस्टम" शब्द जावा में काफी भारी है, इसलिए Google मुझे एक हर्षित शोर दे रहा है: सिग्नल अनुपात।) अगर किसी के पास कोई सलाह है कि मैं System.dll का प्रतिनिधित्व करने वाले COM ऑब्जेक्ट पर हाथ कैसे रखूं, तो मुझे सुन।


संपादित करें, 2009/04/21: स्पष्टीकरण: यह एक XP सिस्टम पर है।

इसके अलावा: मेरा शोध यह सुझाव दे रहा है कि केवल डब्ल्यूएमपी ऑब्जेक्ट से बात करना अपर्याप्त है; आपको इससे अधिक कसकर लपेटने की ज़रूरत है ताकि वह वापस बात कर सके। बहुत सी सी ++ सामानों के साथ एक डब्लूएमपी एसडीके है, लेकिन ऐसा लगता है कि मेरे पास माइक्रोसॉफ्ट विजुअल सी ++ एक्सटेंशन पर कोड नहीं है जो मेरे पास नहीं है और वे मुफ्त में नहीं दे रहे हैं। (इसके अलावा, मैंने बारह वर्षों में सी ++ नहीं किया है।) मुझे पता है कि सी # के साथ यह संभव है, लेकिन अगर मैं जावा के बाहर जा रहा हूं, तो मुझे एक स्टैंडअलोन निष्पादन योग्य होने का समाधान चाहिए और .NET इंस्टॉल नहीं है प्रासंगिक मशीनें


संपादित करें, 2009/04/22: प्रति नीचे मार्क का जवाब, मैं WinUser.h से बाहर APPCOMMAND_MEDIA_ खोदा * स्थिरांक और निम्नलिखित कोड है, जो NativeCall API का उपयोग करता कोशिश की:

final int APPCOMMAND_MEDIA_PLAY = 46; 
final int APPCOMMAND_MEDIA_PAUSE = 47; 

NativeCall.init(); 

IntCall findWindow = new IntCall("user32", "FindWindowA"); 
int wmpHandle = findWindow.executeCall(new Object[] { null, "Windows Media Player" }); 
System.out.println("wmpHandle: " + wmpHandle); 
System.out.println("Find Window Error? " + findWindow.getLastError()); 

IntCall sendMessage = new IntCall("user32", "SendMessageA"); 

int playResult = sendMessage.executeCall(new Object[] { wmpHandle, APPCOMMAND_MEDIA_PLAY, 0, 0 }); 
System.out.println("Play Result: " + playResult); 
System.out.println("Play Error? " + sendMessage.getLastError()); 

try { Thread.sleep(5000); } catch (Exception e) {} 

int pauseResult = sendMessage.executeCall(new Object[] { wmpHandle, APPCOMMAND_MEDIA_PAUSE, 0, 0 }); 
System.out.println("Pause Result: " + pauseResult); 
System.out.println("PauseError? " + sendMessage.getLastError()); 

यह मैं का एक परिणाम देता है:

 
wmpHandle: 1640048 
Find Window Error? null 
Play Result: -1 
Play Error? null 
Pause Result: -1 
PauseError? null 

... लेकिन वास्तव में मीडिया प्लेयर को प्रभावित नहीं करता।

मैंने इसे APPCOMMAND_MEDIA_PLAY_PAUSE (14) के साथ भी आजमाया है, जो अलग-अलग रिटर्न मान देता है (20) लेकिन कुछ भी नहीं करता है।

एफडब्ल्यूआईडब्ल्यू, मुझे वास्तव में एक व्यवहार्य विकल्प होने के लिए व्यक्तिगत प्ले/PAUSE आदेशों को काम करने की आवश्यकता है; बस राज्य को अंधाधुंध करने से मेरी मदद नहीं होती है क्योंकि मुझे नहीं पता कि जब खिलाड़ी शुरू होता है तो खिलाड़ी किस स्थिति में होता है।

क्या किसी के पास कोई भी सलाह है कि मैं क्या गलत कर रहा हूं या मैं और क्या कोशिश कर सकता हूं?

+0

खैर मेरे पास वास्तव में आपकी समस्या का कहना कुछ भी नहीं है बस आप का समर्थन करना चाहते हैं। – User

+1

मुझे बहुत खेद है, आप वास्तव में निराश लगते हैं और मैं समझ सकता हूं क्यों। तो इच्छा है कि मैं मदद कर सकता हूं, लेकिन मुझे इसमें कोई अनुभव नहीं है। बस मुझे लगा कि मुझे थोड़ा नैतिक समर्थन देने की ज़रूरत है, भले ही इसमें मेरा इनपुट लगभग बेकार है। आशा है कि आप इसे पिछले कर लेंगे! –

+0

मैं आप दोनों के लिए धन्यवाद; आपके समर्थन की सराहना की है। :-) – BlairHippo

उत्तर

2

तो क्या यह काम नहीं करते?

wmp.getProperty("settings").toDispatch().setProperty("mute", 1); 
wmp.getProperty("controls").toDispatch().invoke("pause"); 

(गलत कोड के लिए क्षमा याचना, मैं पहले याकूब का उपयोग किया है कभी नहीं)


उस मामले में,/find किसी भी खिड़की और send यह APPCOMMAND_MEDIA_PLAY_PAUSE पैदा करते हैं। डिफ़ॉल्ट संदेश प्रसंस्करण से यह डब्लूएमपी को प्रभावित करेगा। (म्यूट भेजना अच्छा नहीं है, क्योंकि यह पूरे सिस्टम को म्यूट करेगा।)

पोर्टेबिलिटी के लिए, मैं एक सी ++ कमांड लाइन उपयोगिता या जेएनआई का उपयोग करने की सलाह दूंगा, लेकिन NativeCall अब पर्याप्त हो सकता है।


आपका कोड अच्छा दिखता है, लेकिन मुझे लगता है कि आपको केवल SendMessage में पैरामीटर बदलने की आवश्यकता है। प्रयास करें:

final int WM_APPCOMMAND = 0x0319; 
int playResult = sendMessage.executeCall(new Object[] { 
     wmpHandle, 
     WM_APPCOMMAND, 
     wmpHandle, 
     APPCOMMAND_MEDIA_PLAY << 16}); 

APPCOMMAND_MEDIA_PLAY XP SP1 की आवश्यकता है, लेकिन मैं आपको लगता है कि तैनात है संभालने हूँ।

+0

मैं बहुत ईमानदारी से कामना करता हूं। :-) दुर्भाग्यवश नहीं। आगे के शोध ने संकेत दिया है कि, मूल रूप से, जब आप इस तरह डब्लूएमपी से बात करने का प्रयास करते हैं, तो यह प्रश्न पूछने जा रहा है - और यदि आपको यह नहीं लगता कि आपको क्या कहना है, तो यह आपको अनदेखा कर देगा। (जो मेरे अनुभव के अनुरूप है।) उन आदेशों को निष्पादित करना एक सैंडबॉक्स से जुड़े खिलौने स्टीयरिंग व्हील के साथ खेलना है; आप इसे जितना चाहें उतना स्पिन कर सकते हैं, लेकिन वास्तव में कुछ भी नहीं हो रहा है। – BlairHippo

+0

हां, आपको शायद IWMPRemoteMediaServices को लागू करने की आवश्यकता है, जिसे मैं अनुमान लगा रहा हूं कि जैकब नहीं कर सकता है। – Mark

+0

धन्यवाद! यह एक ऐसा दृष्टिकोण है जिसे मैंने पहले नहीं माना था, लेकिन दुर्भाग्य से, यह अभी तक काफी काम नहीं कर रहा है। कृपया उपर्युक्त संपादित पोस्ट देखें और मुझे बताएं कि क्या आपको कोई अंतर्दृष्टि है कि मैं इसे कैसे खराब कर रहा हूं। – BlairHippo

1

यह लग रहा है जब आप एक नया ActiveXComponent रूप wmpSettings का दृष्टांत, याकूब वास्तव में कुछ अजीब कर रहा है एक नया मीडिया प्लेयर वस्तु में घटक रैप करने के लिए के बजाय सेटिंग्स संपत्ति आप के लिए पूछ रहे हैं पुन: प्राप्त करने की तरह।

आप बस की कोशिश की है:

Dispatch wmpSettings = wmp.getProperty("settings").toDispatch(); 
wmpSettings.setProperty("volume", 0); 

मैं भी वापस चला गया और मूल प्रश्न है कि आप याकूब का उपयोग कर चढ़ गया पढ़ सकते हैं और मैं तुम्हें बहुत के लिए इस पर अपने पहियों कताई हवा मामले में एक अलग दृष्टिकोण कर सकते हैं सुझाव लंबा।

मैंने एक वेब एप्लिकेशन स्थापित किया था जो एक विशिष्ट उपयोगकर्ता के डेस्कटॉप पर Winamp से चल रहे एक शॉउटकास्ट सर्वर से इंटरैक्ट किया गया था जो वर्तमान में वेब ऐप सर्वर में लॉग इन था। मैं वेब अनुप्रयोग के संदर्भ में उपयोगकर्ता के Winamp के उदाहरण के साथ सीधे संवाद करने के लिए COM का उपयोग नहीं कर सका, इसलिए मैंने एक सरल सी # टीसीपी/आईपी विनम्प ब्रिज एप्लिकेशन सेट किया जो shoutcast उपयोगकर्ता के डेस्कटॉप पर चला गया और वेब एप्लिकेशन को बनाने के लिए अनुमति दी लोकलहोस्ट से सॉकेट कनेक्शन।

WMP के लिए मुझे यकीन है कि आप WmpRemote.zip के लिए कोड की तरह कुछ सी # रैपर अगर आप http://d.hatena.ne.jp/punidama/20080227

पर एक पाठ खोज करते हैं आप पा सकते हैं पा सकते हैं यदि आप इस सेटिंग के लिए किसी विशिष्ट उदाहरण की जरूरत है मुझे जानते हैं हूँ अप।

+0

अरे, प्रतिक्रिया के लिए धन्यवाद। आपके द्वारा सुझाए गए कोड संकलित नहीं होते हैं (Dispatch.setProperty() जैसी कोई चीज़ नहीं है, लेकिन यह करता है: "Dispatch.put (wmpSettings," वॉल्यूम ", 0);" पहले जैसा ही व्यवहार करता है, दुर्भाग्य से – BlairHippo

+0

क्या आप ऐसे किसी भी सी # रैपर के बारे में जानते हैं जिन्हें स्टैंडअलोन ऐप्स के रूप में चलाने के लिए संकलित किया गया है? उन सभी मशीनों को .NET को तैनात करना जिन्हें इसे चलाने की आवश्यकता होगी, एक विकल्प नहीं है। (मुझे लगता है कि मुझे सी #/नेट के बारे में बहुत कुछ पता नहीं है, इसलिए माफी माँगती है कि यह एक बेवकूफ सवाल है। :-)) – BlairHippo