0

是否可以在 C# 项目中使用 Rainmeter 中的 NowPlaying.dll(C++),如果可以,如何使用?可以在没有运行 Rainmeter 的情况下使用 .dll 吗?我想从 Windows Media Player 获取当前歌曲的元数据。

这是头文件之一(PlayerWMP.h):

#define __PLAYERWMP_H__

#include "Player.h"
#include <wmp.h>
#include <wrl/client.h>

class PlayerWMP : public Player
{
public:
virtual ~PlayerWMP();

static Player* Create();

virtual void UpdateData();

virtual void Pause();
virtual void Play();
virtual void Stop();
virtual void Next();
virtual void Previous();
virtual void SetPosition(int position);
virtual void SetRating(int rating);
virtual void SetVolume(int volume);
virtual void OpenPlayer(std::wstring& path);
virtual void ClosePlayer();

protected:
PlayerWMP();

private:
class CRemoteHost :
    public IServiceProvider,
    public IWMPRemoteMediaServices,
    public IWMPEvents
{
public:
    CRemoteHost();
    ~CRemoteHost();

    PlayerWMP* m_Player;

    IUnknown* GetUnknown() const { return (IServiceProvider*)this; }

    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID uuid, void** object) override;
    virtual ULONG STDMETHODCALLTYPE AddRef() override;
    virtual ULONG STDMETHODCALLTYPE Release() override;

    // IServiceProvider
    STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void** ppv);

    // IWMPRemoteMediaServices
    STDMETHOD(GetServiceType)(BSTR* pbstrType);
    STDMETHOD(GetApplicationName)(BSTR* pbstrName);
    STDMETHOD(GetScriptableObject)(BSTR* pbstrName, IDispatch** ppDispatch);
    STDMETHOD(GetCustomUIMode)(BSTR* pbstrFile);

    // IWMPEvents
    void STDMETHODCALLTYPE OpenStateChange(long NewState) {}
    void STDMETHODCALLTYPE PlayStateChange(long NewState);
    void STDMETHODCALLTYPE AudioLanguageChange(long LangID) {}
    void STDMETHODCALLTYPE StatusChange() {}
    void STDMETHODCALLTYPE ScriptCommand(BSTR scType, BSTR Param) {}
    void STDMETHODCALLTYPE NewStream() {}
    void STDMETHODCALLTYPE Disconnect(long Result) {}
    void STDMETHODCALLTYPE Buffering(VARIANT_BOOL Start) {}
    void STDMETHODCALLTYPE Error() {}
    void STDMETHODCALLTYPE Warning(long WarningType, long Param, BSTR Description) {}
    void STDMETHODCALLTYPE EndOfStream(long Result) {}
    void STDMETHODCALLTYPE PositionChange(double oldPosition, double newPosition) {}
    void STDMETHODCALLTYPE MarkerHit(long MarkerNum) {}
    void STDMETHODCALLTYPE DurationUnitChange(long NewDurationUnit) {}
    void STDMETHODCALLTYPE CdromMediaChange(long CdromNum) {}
    void STDMETHODCALLTYPE PlaylistChange(IDispatch* Playlist, WMPPlaylistChangeEventType change) {}
    void STDMETHODCALLTYPE CurrentPlaylistChange(WMPPlaylistChangeEventType change) {}
    void STDMETHODCALLTYPE CurrentPlaylistItemAvailable(BSTR bstrItemName) {}
    void STDMETHODCALLTYPE MediaChange(IDispatch* pdispMedia) {}
    void STDMETHODCALLTYPE CurrentMediaItemAvailable(BSTR bstrItemName) {}
    void STDMETHODCALLTYPE CurrentItemChange(IDispatch* pdispMedia);
    void STDMETHODCALLTYPE MediaCollectionChange() {}
    void STDMETHODCALLTYPE MediaCollectionAttributeStringAdded(BSTR bstrAttribName,  BSTR bstrAttribVal) {}
    void STDMETHODCALLTYPE MediaCollectionAttributeStringRemoved(BSTR bstrAttribName,  BSTR bstrAttribVal) {}
    void STDMETHODCALLTYPE MediaCollectionAttributeStringChanged(BSTR bstrAttribName, BSTR bstrOldAttribVal, BSTR bstrNewAttribVal) {}
    void STDMETHODCALLTYPE PlaylistCollectionChange() {}
    void STDMETHODCALLTYPE PlaylistCollectionPlaylistAdded(BSTR bstrPlaylistName) {}
    void STDMETHODCALLTYPE PlaylistCollectionPlaylistRemoved(BSTR bstrPlaylistName) {}
    void STDMETHODCALLTYPE PlaylistCollectionPlaylistSetAsDeleted(BSTR bstrPlaylistName, VARIANT_BOOL varfIsDeleted) {}
    void STDMETHODCALLTYPE ModeChange(BSTR ModeName, VARIANT_BOOL NewValue) {}
    void STDMETHODCALLTYPE MediaError(IDispatch* pMediaObject) {}
    void STDMETHODCALLTYPE OpenPlaylistSwitch(IDispatch* pItem) {}
    void STDMETHODCALLTYPE DomainChange(BSTR strDomain) {}
    void STDMETHODCALLTYPE SwitchedToPlayerApplication() {}
    void STDMETHODCALLTYPE SwitchedToControl();
    void STDMETHODCALLTYPE PlayerDockedStateChange() {}
    void STDMETHODCALLTYPE PlayerReconnect() {}
    void STDMETHODCALLTYPE Click(short nButton, short nShiftState, long fX, long fY) {}
    void STDMETHODCALLTYPE DoubleClick(short nButton, short nShiftState, long fX, long fY) {}
    void STDMETHODCALLTYPE KeyDown(short nKeyCode, short nShiftState) {}
    void STDMETHODCALLTYPE KeyPress(short nKeyAscii) {}
    void STDMETHODCALLTYPE KeyUp(short nKeyCode, short nShiftState) {}
    void STDMETHODCALLTYPE MouseDown(short nButton, short nShiftState, long fX, long fY) {}
    void STDMETHODCALLTYPE MouseMove(short nButton, short nShiftState, long fX, long fY) {}
    void STDMETHODCALLTYPE MouseUp(short nButton, short nShiftState, long fX, long fY) {}

private: 
ULONG m_RefCount;
};

void Initialize();
void Uninitialize();

static Player* c_Player;

bool m_TrackChanged;
HWND m_Window;
DWORD m_LastCheckTime;

Microsoft::WRL::ComPtr<IWMPPlayer4> m_IPlayer;
Microsoft::WRL::ComPtr<IWMPControls> m_IControls;
Microsoft::WRL::ComPtr<IWMPSettings> m_ISettings;
Microsoft::WRL::ComPtr<IConnectionPoint> m_IConnectionPoint;
DWORD m_ConnectionCookie;
};

问候,菲利克斯

4

1 回答 1

0

不幸的是,您不能直接从 C# 使用 c++ 类。如果你真的想要这个,你必须在 Visual C++ 中创建 ref 类以将这些类包装在提到的头文件中。

于 2014-10-09T20:45:24.770 回答