📄 mlplugin.cpp
字号:
#include "MlPlugin.h"
#include <shlobj.h>
HINSTANCE g_hInstance = NULL;
HMODULE g_hModMiniLyrics = NULL;
CMLService g_MLService;
HWND g_hwndPlayer = NULL;
PlayerServiceEntry g_PlayerEntry;
char g_szWorkingFolder[MAX_PATH];
IPlayer *g_pPlayer = NULL;
// PURPOSE : Get full task save file name by task name.
//
// PARAMETER:
// szPath is the path that returned: format is like : "c:\\antivirus\\"
BOOL GetProgramPath(TCHAR szPath[], HINSTANCE hInstance/* = NULL*/)
{
__try
{
int nLen;
nLen = GetModuleFileName(hInstance, szPath, MAX_PATH);
nLen --;
while (nLen >= 0 && szPath[nLen] != '\\')
nLen --;
if (nLen < 0)
return FALSE;
szPath[nLen + 1] = '\0';
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return FALSE;
}
return TRUE;
}
BOOL WritePrivateProfileInt(
LPCTSTR lpAppName, // section name
LPCTSTR lpKeyName, // key name
int nValue, // int to add
LPCTSTR lpFileName // initialization file
)
{
TCHAR szBuffer[16];
wsprintf(szBuffer, "%d", nValue);
return WritePrivateProfileString(lpAppName, lpKeyName, szBuffer, lpFileName);
}
BOOL InitMiniLyricsPlugin(HINSTANCE hInst, IPlayer *pPlayer)
{
char szMiniLyricsDll[MAX_PATH];
char szPlayerIni[MAX_PATH];
BOOL bNoPrompt;
char szMsg[256];
FUNMiniLyricsInitEntryPoint funMLInitEntryPoint;
g_hInstance = hInst;
g_pPlayer = pPlayer;
g_PlayerEntry.uVersion = ML_PLAYER_IF_VERSION;
g_PlayerEntry.uSize = sizeof(g_PlayerEntry);
g_PlayerEntry.funPlayerService = PlayerImpService;
GetProgramPath(szPlayerIni, g_hInstance);
strcat(szPlayerIni, "MLPlugin.ini");
bNoPrompt = GetPrivateProfileInt("MiniLyrics", "NoPrompt", FALSE, szPlayerIni);
GetPrivateProfileString("MiniLyrics", "WorkingFolder", "", g_szWorkingFolder, MAX_PATH, szPlayerIni);
if (g_szWorkingFolder[0] == '\0')
GetProgramPath(g_szWorkingFolder, g_hInstance);
DirStringFormat(g_szWorkingFolder);
//
// 是否需要提示?
strcpy(szMiniLyricsDll, g_szWorkingFolder);
strcat(szMiniLyricsDll, "MiniLyrics.dll");
if (!IsFileExist(szMiniLyricsDll))
{
strcpy(szMsg, "Can't Find MiniLyrics.dll, Please Install MiniLyrics Again!");
goto INIT_FAILED;
}
g_hModMiniLyrics = LoadLibrary(szMiniLyricsDll);
if (!g_hModMiniLyrics)
{
wsprintf(szMsg, "Load MiniLyrics dynamic library: %s FAILED!", szMiniLyricsDll);
goto INIT_FAILED;
}
funMLInitEntryPoint = (FUNMiniLyricsInitEntryPoint)GetProcAddress(g_hModMiniLyrics, "MiniLyricsInitEntryPoint");
assert(funMLInitEntryPoint);
if (funMLInitEntryPoint)
{
MLServiceEntry *pMLService;
pMLService = funMLInitEntryPoint(&g_PlayerEntry);
if (!pMLService)
return FALSE;
if (!g_MLService.SetEntryPoint(pMLService))
return FALSE;
}
else
{
strcpy(szMsg, "Get Minilyrics.dll entry point FAILED!");
goto INIT_FAILED;
}
// Initialize minilyrics's all module
if (!g_MLService.Init(g_hModMiniLyrics))
return FALSE;
return TRUE;
INIT_FAILED:
if (!bNoPrompt)
{
// 提示给用户
MessageBox(g_hwndPlayer, szMsg, "MiniLyrics", MB_OK);
WritePrivateProfileInt("MiniLyrics", "NoPrompt", TRUE, szPlayerIni);
}
return FALSE;
}
// 安全的字符串拷贝,如果超出长度范围,则进行截断
char *strcpy_safe(char *strDestination, int nLenMax, const char *strSource)
{
char *cp = strDestination;
char *cpEnd = strDestination + nLenMax - 1;
for (; cp < cpEnd && *strSource; cp++, strSource++)
{
*cp = *strSource;
}
*cp = '\0';
return(strDestination);
}
// PURPOSE: to judege whether the specified file or path exist
//
// PARAMETERS:
// szFileName - the file or path
//
BOOL IsFileExist(LPCTSTR szFileName)
{
return (GetFileAttributes(szFileName) != -1);
}
// COMMENT:
// 将目录字符串格式化为末尾带'\\'的
void DirStringFormat(LPTSTR szDir)
{
int nLen;
nLen = strlen(szDir);
if (nLen > 0)
{
if (szDir[nLen - 1] != '\\')
{
szDir[nLen] = '\\';
szDir[nLen + 1] = '\0';
}
}
}
long PlayerImpService(int nCommand, MLPARAM Param1, MLPARAM Param2)
{
if (!g_pPlayer)
return -1;
switch(nCommand)
{
case cmdPlay:
g_pPlayer->Play();
break;
case cmdPause:
g_pPlayer->Pause();
break;
case cmdPlayPause:
g_pPlayer->PlayPause();
break;
case cmdStop:
g_pPlayer->Stop();
break;
case cmdPrev:
g_pPlayer->Prev();
break;
case cmdNext:
g_pPlayer->Next();
break;
case cmdSeek: // param1, seek pos, ms
g_pPlayer->SeekTo(Param1);
break;
case cmdGetPos: // param1, long * pos, ms
{
return g_pPlayer->GetPlayPos();
}
break;
case cmdGetMediaLength: // param1, long * length, ms
{
return g_pPlayer->GetMediaLength();
}
break;
case cmdGetSourceMedia: // param1, const char *buffer, param2, buffer length
{
char *szBuffer;
szBuffer = (char *)Param1;
g_pPlayer->GetSourceMedia(szBuffer, Param2);
}
break;
case cmdGetArtist: // param1, const char *buffer, param2, buffer length
{
char *szBuffer;
szBuffer = (char *)Param1;
g_pPlayer->GetArtist(szBuffer, Param2);
}
break;
case cmdGetFullTitle: // param1, const char *buffer, param2, buffer length
{
char *szBuffer;
szBuffer = (char *)Param1;
g_pPlayer->GetFullTitle(szBuffer, Param2);
}
break;
case cmdGetTitle: // param1, const char *buffer, param2, buffer length
{
char *szBuffer;
szBuffer = (char *)Param1;
g_pPlayer->GetTitle(szBuffer, Param2);
}
break;
case cmdGetAlbum: // param1, const char *buffer, param2, buffer length
{
char *szBuffer;
szBuffer = (char *)Param1;
g_pPlayer->GetAlbum(szBuffer, Param2);
}
break;
case cmdGetPlayerState: // param1, long * player state,1-stop, 2-play, 3-pause
{
return g_pPlayer->GetPlayerState();
}
break;
case cmdGetPlayerName: // param1, const char *buffer, param2, buffer length
{
char *szBuffer;
szBuffer = (char *)Param1;
g_pPlayer->GetPlayerName(szBuffer, Param2);
}
break;
case cmdInit: // init the player interface
g_pPlayer->Init();
break;
case cmdQuit: // quit the player interface
g_pPlayer->Quit();
break;
// for winamp2
case cmdGetCurSkinPath: // param1, const char *buffer, param2, buffer length
{
char *szBuffer;
szBuffer = (char *)Param1;
g_pPlayer->GetCurSkinPath(szBuffer, Param2);
}
break;
case cmdGetProxy: // param1, const char *buffer, param2, buffer length
{
char *szBuffer;
szBuffer = (char *)Param1;
g_pPlayer->GetProxy(szBuffer, Param2);
}
break;
case cmdGetMainWnd:
return (long)g_pPlayer->GetMainWnd();
case cmdHasVideo:
return (long)g_pPlayer->HasVideo();
case cmdGetPlayerPlugInstance:
return (long)g_hInstance;
case cmdCodePageChanged:
g_pPlayer->OnCodePageChanged(DWORD(Param1));
break;
case cmdGetPluginParentWnd:
return (long)g_pPlayer->GetPluginParentWnd((RECT*)Param1);
case notifySkinCreated:
g_pPlayer->OnNotifySkinCreated();
return 1;
case cmdSetTimeUpdateFreq:
// set play time postion's update frequency
// 0: slow, 1 : normal: 2: fast
g_pPlayer->SetTimeUpdateFreq(Param1);
default:
// unknonw command
{
TCHAR szMsg[256];
wsprintf(szMsg, "Unprocessed player control message: %d", nCommand);
g_MLService.Log(szMsg);
return -1;
}
break;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -