65.9K
CodeProject 正在变化。 阅读更多。
Home

程序化控制 Winamp2/3/Sonique

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.55/5 (8投票s)

2003 年 3 月 12 日

1分钟阅读

viewsIcon

71794

downloadIcon

788

一篇关于从外部程序控制流行的媒体播放器的文章。

引言

本文展示了一种从外部程序程序化控制 Winamp 1.x-2.x、Winamp3 和 Sonique 1.x 的方法。

背景

前段时间,我为一款很酷的小工具 Codename: Dashboard 做了测试。基本上,它是一个类似侧边栏的程序,作为子组件的容器。

无论如何,它有一个很棒的 Windows Media Player 组件,但没有 Winamp 的组件。在与 MP3 和 WMP 6.4 体验不佳之后,我基本上拒绝将其用作我的媒体播放器。(我知道……我听说 WMP9 更好。时间会证明一切。)这促使我为 Winamp 编写一个组件…

只有一个问题:我找不到任何关于远程控制 Winamp3 的文档。 似乎 Nullsoft 团队在 Wasabi 中遗漏了这个功能。因此,在一番挖掘之后,我得出了以下结论。

使用代码

首先,我们必须弄清楚我们正在运行哪个播放器

HWND FindPlayer(int wanted) 
{
    HWND hwnd;

    if (wanted == 0 || wanted == 4) {
        hwnd = FindWindow("Sonique Window Class", NULL);
        if (hwnd != 0) {
            playerID = 4;
            return hwnd;
        }
    }

    if (wanted == 0 || wanted == 3) {
        hwnd = FindWindow("Studio", NULL);
        if (hwnd != 0) {
            playerID = 3;
            return hwnd;
        }
    }

    if (wanted == 0 || wanted == 2) {
        hwnd = FindWindow("Winamp v1.x", NULL);
        if (hwnd != 0) {
            playerID = 2;
            return hwnd;
        }
    }

    playerID = 0;

    return 0;
}

接下来,我们确定要发送哪个命令

// Winamp 2 defines
#define W2_PREV             40044
#define W2_PLAY             40045
#define W2_PAUSE            40046
#define W2_STOP             40047
#define W2_NEXT             40048
#define W2_FILEPLAY         40029 

#define W2_ISPLAYING        104
#define W2_OUTPUTTIME       105
#define W2_JUMPTOTIME       106
#define W2_SETPLAYLISTPOS   121
#define W2_GETLISTLENGTH    124
#define W2_GETLISTPOS       125
#define W2_GETINFO          126


// Winamp 3 defines
#define W3_PREV                   'z'
#define W3_PLAY                   'x'
#define W3_PAUSE                   'c'
#define W3_STOP                   'v'
#define W3_NEXT                   'b'
#define W3_FILEPLAY               'l'


// Sonique 1 defines
#define S1_PREV                  'z'
#define S1_PLAY                 'x'
#define S1_PAUSE                 'c'
#define S1_STOP                 'v'
#define S1_NEXT            'b'
#define S1_FILEPLAY        'l'

然后我们将命令发送到正确的窗口

void SendW3Key(HWND hwnd_winamp,char message)
{
    short key = VkKeyScan(message);
    UINT scancode = MapVirtualKey(key, 0);
    PostMessage(hwnd_winamp, WM_KEYDOWN, key, scancode);
    PostMessage(hwnd_winamp, WM_CHAR, key, scancode);
    PostMessage(hwnd_winamp, WM_KEYUP, key, scancode);
}

所以,将所有内容整合起来,看起来像这样

private void AmpControl_Play(void)
{
HWND hwnd_winamp = FindPlayer(0);

    if (hwnd_winamp != 0) {
        if (playerID == 2) {
            SendMessage(hwnd_winamp, WM_COMMAND, W2_PLAY, 0);
        }
        else if (playerID == 3) {
            SendW3Key(hwnd_winamp, W3_PLAY);
        }
        else if (playerID == 4) {
            SendW3Key(hwnd_winamp, S1_PLAY);
        }
    }
}

源代码包括播放、暂停、下一首、上一首、打开和停止。全部打包在一个易于使用的 DLL 项目中。

历史

v1.0.0.0 - 2003年3月11日 - 初始发布

© . All rights reserved.