实现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查看各按钮的大概像素位置。
下一首按钮位置大概为(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)
托盘效果:
测试,成功切换音乐。至此,播放器的简单功能基本实现。注:如果使用QSystemTrayIcon,构造时需要设置parent,否则图标可能会驻留托盘。
PS:所有代码在https://github.com/pansinm/WebKugou,比较乱。