实现WebKugou客户端后,接着实现托盘菜单切换音乐。主要原理是在窗口指定位置发送单击消息,模拟鼠标操作。


首先想到的是Windows API,所以查Windows API接口。mouse_event肯定不行,因为其模拟硬件,点击时窗口要回到激活状态。接着用SendMessage和PostMessage测试,折腾了将近一天,还是没成功。


于是放弃了Windows API,转向Qt自身API,鼠标事件没问题,怎么接收呢,简单搜索,发现了

void QCoreApplication::postEvent(QObject*receiver,QEvent*event,intpriority= Qt::NormalEventPriority)[static]


先用closeButton试验,

QMouseEvent*press=newQMouseEvent(QEvent::MouseButtonPress,QPoint(2,2),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
QApplication::postEvent(closeButton,press);
QMouseEvent*release=newQMouseEvent(QEvent::MouseButtonRelease,QPoint(2,2),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
QApplication::postEvent(closeButton,release);


成功关闭程序!接着,截图,用PS查看各按钮的大概像素位置。


WebKugou客户端增强--实现音乐切换_第1张图片


下一首按钮位置大概为(206,116),播放|暂停大概为(168,116),上一首大概为(128,116)


添加如下槽函数:

//下一首
void WebKugouWidget::playNext()
{
    QMouseEvent* press=new QMouseEvent(QEvent::MouseButtonPress,QPoint(206,116),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
    QApplication::postEvent(kgwebView,press);
    QMouseEvent* release=new QMouseEvent(QEvent::MouseButtonRelease,QPoint(206,116),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
    QApplication::postEvent(kgwebView,release);
}
//播放暂停
void WebKugouWidget::playOrPause()
{
    QMouseEvent* press=new QMouseEvent(QEvent::MouseButtonPress,QPoint(168,116),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
    QApplication::postEvent(kgwebView,press);
    QMouseEvent* release=new QMouseEvent(QEvent::MouseButtonRelease,QPoint(168,116),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
    QApplication::postEvent(kgwebView,release);
}
//上一首
void WebKugouWidget::playPrevious()
{
    QMouseEvent* press=new QMouseEvent(QEvent::MouseButtonPress,QPoint(128,116),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
    QApplication::postEvent(kgwebView,press);
    QMouseEvent* release=new QMouseEvent(QEvent::MouseButtonRelease,QPoint(128,116),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
    QApplication::postEvent(kgwebView,release);
}

使用QSystemTrayIcon类构造图盘图标,添加托盘菜单,以下函数可设置托盘菜单。


void QSystemTrayIcon::setContextMenu(QMenu * menu)

托盘效果:

WebKugou客户端增强--实现音乐切换_第2张图片


测试,成功切换音乐。至此,播放器的简单功能基本实现。注:如果使用QSystemTrayIcon,构造时需要设置parent,否则图标可能会驻留托盘。


PS:所有代码在https://github.com/pansinm/WebKugou,比较乱。