C ++ - 没有ActiveX或MFC的Windows Media Player自动化是否可行?

时间:2014-08-17 08:42:34

标签: c++ windows com windows-media-player wmp

我一直在努力实现Media Player Automation。我几乎尝试了所有可能的方式,但没有任何成功。下面列出的尝试很少。

  • 无论我尝试什么,都不能创建LOCAL_SERVER。 对于CLSCTX_LOCAL_SERVER,我总是得到class not registered error

  • 从控制台应用程序开始,将其转换为此处建议Message Pump的Window应用程序,但仍然无法播放WMP。

  • 无论如何,我继续使用IWMPPlayer4,openPlayer()方法确实有效,打开WMP并开始播放剪辑。但是任何其他消息都没有达到WMP。例如,

    IWMPSettings    *pMediaPlayerSettings = NULL;
    hr = pMediaPlayer4->get_settings(&pMediaPlayerSettings);
    
    if(FAILED(hr))
        {
            std::cout << "ERR - Could not get WMPSettings Interface Pointer" << std::endl;
            ReleaseInterfaces((IUnknown**)&pMediaPlayer4);
            return 0;
        }
    
    std::cout << "Got settings.. lets change volume" << std::endl;
    int cnt = 10;
    while(cnt > 1)
    {
        long vol = -1.0;
        Sleep(2000);
        hr = pMediaPlayerSettings->get_volume(&vol);
        if(FAILED(hr))
        {
            std::cout << "ERR - Could not change the volume" << std::endl;
        }
        std::cout << "Currently volume is: " << vol << std::endl;
        hr = pMediaPlayerSettings->put_volume(cnt*cnt);
        cnt--;
    }
    
    ReleaseInterfaces((IUnknown**) &pMediaPlayerSettings);
    

    此代码更改音量,但不知何故该效果在正在播放的剪辑中不存在。

  • 然后我想可能Invoke会将消息发送到运行当前剪辑的WMP。尝试了这段代码,但无济于事。

所以我要求的是 - 我在尝试什么,它是否可能?

用于控制媒体播放器的Raw-COM代码?任何指针,示例,代码片段都非常受欢迎。我有一种错误的感觉,我在这个问题上浏览了整个网络世界。请证明我错了。

PS:我不想做ActiveX或MFC编码。

1 个答案:

答案 0 :(得分:2)

此问题与您的应用程序是控制台应用程序无关。消息泵不在此处。您可以尝试使用Windows应用程序,它的行为也一样。

这是因为在这种情况下,播放器不作为控件托管(作为OLE控件,在窗口中),因此它不受支持。如果您在Windows应用程序或Internet Explorer中托管它,您将看到它正常工作。

在此配置中,如果要控制音量,则应使用volume audio APIs(特别是ISimpleAudioVolume)